阅读量:44
1. SSM 整合(Spring + MyBatis;Spring + Spring MVC)
文章目录
- 1. SSM 整合(Spring + MyBatis;Spring + Spring MVC)
- 2. 引入相关依赖
- 3. SSM 整合
- 4. Spring 整合 + MyBatis
- 5. Spring 整合 Spring MVC
- 6. 实现功能测试ssm整合
- 7. 运行启动 Tomcat 测试
- 8. 最后:
2. 引入相关依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <packaging>war</packaging> <groupId>com.rainbowsea</groupId> <artifactId>ssm-annotation</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties> <dependencies> <!--springmvc--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>6.1.4</version> </dependency> <!--spring jdbc--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>6.1.4</version> </dependency> <!--mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.15</version> </dependency> <!--mybatis spring--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>3.0.3</version> </dependency> <!--mysql驱动--> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.3.0</version> </dependency> <!--德鲁伊连接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.22</version> </dependency> <!--jackson--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.17.0</version> </dependency> <!--servlet api--> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.0.0</version> <scope>provided</scope> </dependency> <!--logback--> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.5.3</version> </dependency> <!--thymeleaf和spring6的整合依赖--> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring6</artifactId> <version>3.1.2.RELEASE</version> </dependency> </dependencies> </project>
3. SSM 整合
3.1 创建包结构
SSM:包括 Spring ,MyBatis,Spring MVC
SSM 的整合:可以大致分为两部分:
- Spring + MyBatis 的整合
- Spring + Spring MVC 的整合
4. Spring 整合 + MyBatis
4.1 编写 jdbc.properties
在类根路径下创建属性配置文件,配置连接数据库的信息:jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/springmvc jdbc.username=root jdbc.password=MySQL123
4.2 编写 DataSourceConfig 数据源配置
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; } }
4.3 编写 MyBatisConfig 的配置类(替换 mybatis的xml配置文件)
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; } }
4.4 编写 SpringConfig 的配置类(替换spring的xml配置文件)
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; } }
5. Spring 整合 Spring MVC
5.1 编写WebAppInitializer(替换 web.xml 文件)
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的 <url-pattern> * * @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}; } }
5.2 编写 SpringMvcConfig 类(替换spring mvc 的xml 配置文件)
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<HandlerExceptionResolver> resolvers) { } // 配置拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { } }
5.3 添加事务控制
第一步:在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 {}
6. 实现功能测试ssm整合
6.1 准备数据表
6.2 pojo类编写
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; } }
6.3 dao编写
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); }
6.4 service编写
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); } }
6.5 handler编写
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; } }
6.6 前端发送ajax
6.6.1 引入 js 文件
6.6.2 开启静态资源处理
@Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); }
6.6.3 视图控制器
public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("index"); }
6.6.4 编写ajax
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>ssm整合</title> <!--引入vue--> <script th:src="@{/static/js/vue3.4.21.js}"></script> <!--引入axios--> <script th:src="@{/static/js/axios.min.js}"></script> </head> <body> <div id="app"> <button @click="getMessage">查看id=1的用户信息</button> <h1>{{message}}</h1> </div> <script th:inline="javascript"> Vue.createApp({ data(){ return { message : '' } }, methods : { async getMessage(){ let response = await axios.get([[@{/}]] + 'users/1') this.message = response.data } } }).mount("#app") </script> </body> </html>
7. 运行启动 Tomcat 测试
8. 最后:
“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”