4.0.0 war com.rainbowsea ssm-annotation 1.0-SNAPSHOT 17 17 org.springframework spring-webmvc 6.1.4 org.springframework spring-jdbc 6.1.4 org.mybatis mybatis 3.5.15 org.mybatis mybatis-spring 3.0.3 com.mysql mysql-connector-j 8.3.0 com.alibaba druid 1.2.22 com.fasterxml.jackson.core jackson-databind 2.17.0 jakarta.servlet jakarta.servlet-api 6.0.0 provided ch.qos.logback logback-classic 1.5.3 org.thymeleaf thymeleaf-spring6 3.1.2.RELEASE
SSM:包括 Spring ,MyBatis,Spring MVC
SSM 的整合:可以大致分为两部分:
在类根路径下创建属性配置文件,配置连接数据库的信息:jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/springmvc jdbc.username=root jdbc.password=MySQL123
package com.rainbowsea.ssm.config; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; /** * 数据源配置 */ @Configuration public class DataSourceConfig { @Value("${jdbc.driver}") private String driver; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String username; @Value("${jdbc.password}") private String password; public DataSourceConfig() { } public DataSourceConfig(String driver, String url, String username, String password) { this.driver = driver; this.url = url; this.username = username; this.password = password; } @Bean public DataSource dataSource() { DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setDriverClassName(driver); druidDataSource.setUrl(url); druidDataSource.setUsername(username); druidDataSource.setPassword(password); return druidDataSource; } }
package com.rainbowsea.ssm.config; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.mapper.MapperScannerConfigurer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; @Configuration public class MyBatisConfig { @Bean public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setTypeAliasesPackage("com.rainbowsea.ssm.bean"); return sqlSessionFactoryBean; } @Bean public MapperScannerConfigurer mapperScannerConfigurer() { MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); mapperScannerConfigurer.setBasePackage("com.rainbowsea.ssm.dao"); return mapperScannerConfigurer; } }
package com.rainbowsea.ssm.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.PropertySource; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; // 标注该类式一个配置文件类 @Configuration // 组件扫描 @ComponentScan("com.rainbowsea.ssm.service") // 属性配置文件位置 @PropertySource("classpath:jdbc.properties") // 导入其他配置到Spring 配置 @Import({MyBatisConfig.class,DataSourceConfig.class}) // 开启事务管理器 @EnableTransactionManagement public class SpringConfig { // 在 DataSourceConfig中添加事务管理器对象 @Bean public PlatformTransactionManager platformTransactionManager(DataSource dataSource){ DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(); dataSourceTransactionManager.setDataSource(dataSource); return dataSourceTransactionManager; } }
package com.rainbowsea.ssm.config; import jakarta.servlet.Filter; import org.springframework.context.annotation.Configuration; import org.springframework.web.filter.CharacterEncodingFilter; import org.springframework.web.filter.HiddenHttpMethodFilter; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; @Configuration public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { /** * Spring的配置 * * @return */ @Override protected Class>[] getRootConfigClasses() { return new Class[]{SpringConfig.class}; } /** * SpringMVC的配置 * * @return */ @Override protected Class>[] getServletConfigClasses() { return new Class[]{SpringMvcConfig.class}; } /** * 用来配置DispatcherServlet的 * * @return */ @Override protected String[] getServletMappings() { return new String[]{"/"}; } /** * 配置过滤器 * * @return */ @Override protected Filter[] getServletFilters() { // 配置字符编码过滤器 CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); characterEncodingFilter.setEncoding("UTF-8"); characterEncodingFilter.setForceResponseEncoding(true); characterEncodingFilter.setForceRequestEncoding(true); // 配置HiddenHttpMethodFilter HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter(); return new Filter[]{characterEncodingFilter, hiddenHttpMethodFilter}; } }
package com.rainbowsea.ssm.config; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.thymeleaf.spring6.SpringTemplateEngine; import org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver; import org.thymeleaf.spring6.view.ThymeleafViewResolver; import org.thymeleaf.templatemode.TemplateMode; import org.thymeleaf.templateresolver.ITemplateResolver; import java.util.List; @Configuration // 标志是配置文件类 @ComponentScan("com.rainbowsea.ssm.handler") @EnableWebMvc public class SpringMvcConfig implements WebMvcConfigurer { // 以下三个方法合并起来就是开启视图解析器 @Bean public ThymeleafViewResolver getViewResolver(SpringTemplateEngine springTemplateEngine) { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(springTemplateEngine); resolver.setCharacterEncoding("UTF-8"); resolver.setOrder(1); return resolver; } @Bean public SpringTemplateEngine templateEngine(ITemplateResolver iTemplateResolver) { SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.setTemplateResolver(iTemplateResolver); return templateEngine; } @Bean public ITemplateResolver templateResolver(ApplicationContext applicationContext) { SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); resolver.setApplicationContext(applicationContext); resolver.setPrefix("/WEB-INF/thymeleaf/"); resolver.setSuffix(".html"); resolver.setTemplateMode(TemplateMode.HTML); resolver.setCharacterEncoding("UTF-8"); resolver.setCacheable(false);//开发时关闭缓存,改动即可生效.发布时,打开 return resolver; } // 开启静态资源处理,开启默认的Servlet处理 @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } // 视图控制器 @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("index"); } // 配置异常处理器 @Override public void configureHandlerExceptionResolvers(List resolvers) { } // 配置拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { } }
第一步:在SpringConfig中开启事务管理器
@EnableTransactionManagement public class SpringConfig { }
第二步:在DataSourceConfig中添加事务管理器对象
@Bean public PlatformTransactionManager platformTransactionManager(DataSource dataSource){ DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(); dataSourceTransactionManager.setDataSource(dataSource); return dataSourceTransactionManager; }
第三步:在service类上添加如下注解:(如果有的话)
@Transactional public class UserService {}
package com.rainbowsea.ssm.bean; import org.springframework.stereotype.Controller; @Controller public class User { private Long id; private String name; private String password; private String email; public User() { } public User(Long id, String name, String password, String email) { this.id = id; this.name = name; this.password = password; this.email = email; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
package com.rainbowsea.ssm.dao; import com.rainbowsea.ssm.bean.User; import org.apache.ibatis.annotations.Select; public interface UserDao { @Select("select * from tbl_user where id = #{id}") User selectById(Long id); }
package com.rainbowsea.ssm.service; import com.rainbowsea.ssm.bean.User; public interface UserService { /** * 根据用户id获取用户信息 */ User getById(Long id); }
package com.rainbowsea.ssm.service.impl; import com.rainbowsea.ssm.bean.User; import com.rainbowsea.ssm.dao.UserDao; import com.rainbowsea.ssm.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public User getById(Long id) { return userDao.selectById(id); } }
package com.rainbowsea.ssm.handler; import com.rainbowsea.ssm.bean.User; import com.rainbowsea.ssm.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/users") public class UserHandler { @Autowired private UserService userService; @GetMapping("/{id}") public User detail(@PathVariable("id") Long id){ User user = userService.getById(id); return user; } }
@Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); }
public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("index"); }
ssm整合 {{message}}
“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”