当前位置:   article > 正文

SSM框架整合—详细整合教程(Spring+SpringMVC+MyBatis)_spring+spring mvc+mvbatis项目

spring+spring mvc+mvbatis项目

MyBatis和Spring整合

1、整合原因

因为Spring中有强大的bean管理机制,解决了对象之间的耦合度,另外对于重用的对象,通过容器来管理比较方便,还提供了强大的事务处理机制。所以把重复的代码都交给spring去处理,也可以提高代码的灵活性。

2、整合条件

根据MyBatis官网的Spring要求,使用MyBatis-Spring的插件继续整合。

官网地址如下:http://mybatis.org/spring/zh/index.html

它的好处是:MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。

它将允许MyBatis参与到 Spring 的事务管理之中,创建映射器 mapperSqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 SpringDataAccessException

最终,可以做到应用代码不依赖于 MyBatisSpring MyBatis-Spring

Spring和MyBatis-Spring的版本要求:

3、整合入门

3.1、在项目中加入mybatis-spring依赖包

在项目的pom.xml中加入以下代码:

  1. <dependency>
  2. <groupId>org.mybatis</groupId>
  3. <artifactId>mybatis-spring</artifactId>
  4. <version>2.0.6</version>
  5. </dependency>

3.2、继续添加spring的依赖

  1. <properties>
  2. <spring-beans.version>5.2.14.RELEASE</spring-beans.version>
  3. </properties>
  4. <!-- 添加spring的依赖包-->
  5. <dependency>
  6. <groupId>org.springframework</groupId>
  7. <artifactId>spring-context</artifactId>
  8. <version>${spring-beans.version}</version>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework</groupId>
  12. <artifactId>spring-core</artifactId>
  13. <version>${spring-beans.version}</version>
  14. </dependency>
  15. <dependency>
  16. <groupId>org.springframework</groupId>
  17. <artifactId>spring-beans</artifactId>
  18. <version>${spring-beans.version}</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.springframework</groupId>
  22. <artifactId>spring-context-support</artifactId>
  23. <version>${spring-beans.version}</version>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework</groupId>
  27. <artifactId>spring-expression</artifactId>
  28. <version>${spring-beans.version}</version>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework</groupId>
  32. <artifactId>spring-jdbc</artifactId>
  33. <version>${spring-beans.version}</version>
  34. </dependency>

3.3、配置spring核心配置文件

默认的spring的核心配置文件是applicationContext.xml,我在此命名为spring-context.xml并且放在resources下新建的spring包中.在项目中的相对路径为:src/main/resources/spring/spring-context.xml

内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://www.springframework.org/schema/beans"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:p="http://www.springframework.org/schema/p"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context-4.2.xsd
  11. http://www.springframework.org/schema/aop
  12. http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
  13. <!-- 配置spring包扫描 -->
  14. <context:component-scan base-package="com.fd"/>
  15. <!-- 添加属性文件配置 -->
  16. <context:property-placeholder location="classpath:config/db.properties" />
  17. <!--连接池-->
  18. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
  19. p:driverClass="${jdbc.driverClass}"
  20. p:jdbcUrl="${jdbc.jdbcUrl}"
  21. p:user="${jdbc.user}"
  22. p:password="${jdbc.password}"
  23. />
  24. </beans>

因为上面使用了c3p0连接池,所以在pom.xml中添加c3p0的依赖

  1. <dependency>
  2. <groupId>com.mchange</groupId>
  3. <artifactId>c3p0</artifactId>
  4. <version>0.9.5.2</version>
  5. </dependency>

同样创建在上面数据库连接使用的classpath下的db.properties

  1. jdbc.driverClass=com.mysql.jdbc.Driver
  2. jdbc.jdbcUrl=jdbc:mysql://localhost:3306/mybatis
  3. jdbc.user=root
  4. jdbc.password=root

注意:db.properties是在classpath:config/db.properties路径下

3.4、配置MyBatis核心初始化类

因为MyBatis中的对象以及初始化都交于Spring来管理,所以,MyBatis核心配置都要写在Spring的核心配置文件中,内容如下:

  1. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  2. <property name="dataSource" ref="dataSource"/>
  3. </bean>

3.5、定义Mapper对象

为了测试方便,先定义一个绑定SQL到接口中的Mapper,这种就可以省略xml映射文件的编写,但是可维护性比较差,一般用来做测试

  1. public interface UserMapper {
  2. @Select("select * from user where id = #{userId}")
  3. User getUser(@Param("userId")String userid);
  4. }

引入依赖

  1. <dependency>
  2. <groupId>org.mybatis</groupId>
  3. <artifactId>mybatis</artifactId>
  4. <version>3.4.5</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>mysql</groupId>
  8. <artifactId>mysql-connector-java</artifactId>
  9. <version>5.1.6</version>
  10. </dependency>

3.7、编写MyBatis-Spring测试类

  1. public class MyBatisSpringTest {
  2. @Test
  3. public void testSpringMyBatis(){
  4. /*构建一个Spring容器*/
  5. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-context.xml");
  6. /*从容器中获取Mapper*/
  7. UserMapper userMapper = applicationContext.getBean(UserMapper.class);
  8. User user = userMapper.getUser("1");
  9. System.out.println("user = " + user);
  10. }
  11. }

4、整合MyBatis现有配置

4.1、修改Spring核心配置文件

在基础的MyBatis用法中,是通过SqlSessionFactoryBuilder来创建SqlSessionFactory的而在MyBatis-Spring中,则使用SqlSessionFactoryBean来创建,所以默认MyBatis的配置属性都都可以通过SqlSessionFactoryBean来设置,最常见的两个设置就是mapper文件的位置和Mapper接口的扫描配置。

  1. <!--配置MyBatis的初始化核心类-->
  2. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  3. <property name="dataSource" ref="dataSource"/>
  4. <!--指定默认mapper映射文件的扫描路径,扫描多个时,可使用list标签-->
  5. <property name="mapperLocations">
  6. <list>
  7. <value>classpath*:mybatis/mapper-*.xml</value>
  8. </list>
  9. </property>
  10. </bean>

如果mapper映射文件的路径和Mapper接口的路径不一样,一般要指定Mapper接口的扫描路径,在Spring核心配置文件中添加Mapper接口扫描路径,如下:

  1. <!--指定mapper接口的扫描路径-->
  2. <mybatis:scan base-package="com.fd.dao"/>

或(2选1即可)

  1. <!--指定mapper接口的扫描路径 方式2-->
  2. <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  3. <property name="basePackage" value="com.fd.dao"/>
  4. </bean>

完整的Spring配置文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://www.springframework.org/schema/beans"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:p="http://www.springframework.org/schema/p" xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context-4.2.xsd
  11. http://www.springframework.org/schema/aop
  12. http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">
  13. <!-- 配置spring包扫描 -->
  14. <context:component-scan base-package="com.fd"/>
  15. <!-- 添加属性文件配置 -->
  16. <context:property-placeholder location="classpath:config/db.properties" />
  17. <!--连接池-->
  18. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
  19. p:driverClass="${jdbc.driverClass}"
  20. p:jdbcUrl="${jdbc.jdbcUrl}"
  21. p:user="${jdbc.user}"
  22. p:password="${jdbc.password}"
  23. />
  24. <!--配置MyBatis的初始化核心类-->
  25. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  26. <property name="dataSource" ref="dataSource"/>
  27. <!--指定默认mapper映射文件的扫描路径,扫描多个时,可使用list标签-->
  28. <property name="mapperLocations">
  29. <list>
  30. <value>classpath*:mybatis/mapper-*.xml</value>
  31. </list>
  32. </property>
  33. </bean>
  34. <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
  35. <property name="mapperInterface" value="com.fd.mapper.UserMapper"/>
  36. <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
  37. </bean>
  38. <!--指定mapper接口的扫描路径-->
  39. <mybatis:scan base-package="com.fd.dao"/>
  40. </beans>

编写测试代码:

  1. @Test
  2. public void testSpringMybatisUser(){
  3. /*构建一个Spring容器*/
  4. /*ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring/spring-context.xml");*/
  5. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("file:D:\\JAVA\\java\\MySSM\\src\\main\\resources\\spring\\spring-context.xml");
  6. /*从容器中获取Mapper*/
  7. UserDao userDao = applicationContext.getBean(UserDao.class);
  8. User user = userDao.getUser("16");
  9. System.out.println("user = " + user);
  10. }

4.2、使用旧的mybatis核心配置文件

在Spring核心配置文件的SqlSessionFactory下添加一行代码:

  1. <!--配置MyBatis的初始化核心类-->
  2. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  3. <property name="dataSource" ref="dataSource"/>
  4. <!--使用旧的mybatis核心配置文件-->
  5. <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
  6. <!--指定默认mapper映射文件的扫描路径,扫描多个时,可使用list标签-->
  7. <property name="mapperLocations">
  8. <list>
  9. <value>classpath*:mybatis/mapper-*.xml</value>
  10. </list>
  11. </property>
  12. </bean>

注意:上述MyBatis核心配置文件中的一些配置(比如mysql环境)等已经交由Spring去管理,所以不需要再做该配置,否则就可能会和Spring中的配置属性起冲突。

SpringMVC和Spring整合

1、整合理论

因为Spring是一个容器,用来解决对象之间的耦合度,所以整合结果就是要Spring统一管理所有Bean和MyBatis以及数据库的事务等。

另外:SpringMVC是基于Spring开发,所以SpringMVC中也有一个管理自己Bean(@Controller)的容器,这个容器和上面Spring的容器不是一个容器,它只管理自己,所以两个容器之间包的扫描要分开。

2、整合实战

因为在整个框架整合中,Spring是管理Bean的容器,所以Spring容器要最先初始化,但是SSM是一个WEB项目,在WEB项目里最先启动的是Listener,所以Spring在WEB项目初始化是通过监听器(Listener)来启动,SpringMVC的启动是通过Servlet来启动。

2.1、配置Spring的启动

首先要把当前项目转换成一个web项目,在maven结构中,web项目的路径是:src/main/webapp/WEB-INF/web.xml 配置web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_4_0.xsd"
  5. version="4.0">
  6. <!--配置Spring监听器启动,在服务器启动的时候最先启动-->
  7. <listener>
  8. <listener-class>
  9. org.springframework.web.context.ContextLoaderListener
  10. </listener-class>
  11. </listener>
  12. <context-param>
  13. <param-name>contextConfigLocation</param-name>
  14. <param-value>classpath:spring/spring-context.xml</param-value>
  15. </context-param>
  16. </web-app>

如果当前项目没有spring-web依赖包,那么需要加入一下:

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-web</artifactId>
  4. <version>${spring-beans.version}</version>
  5. </dependency>

2.2、SpringMVC和Spring代码整合

因为SpringMVC依赖于Spring,所以他自己内部也有个容器,但是该容器只管自己的Controller,所以在包扫描的地方要配置过滤。

2.3、加入SpringMVC的pom依赖

先要在pom.xml加入依赖

  1. <!--加入SpringMVC的GAV依赖-->
  2. <dependency>
  3. <groupId>org.springframework</groupId>
  4. <artifactId>spring-webmvc</artifactId>
  5. <version>${spring-beans.version}</version>
  6. </dependency>

注意:jar的名字是spring-webmvc

2.4、配置核心Servlet

因为SpringMVC的核心是DispatchServlet,是一个WEB开发中的Servlet组件,所以必须要配置在web.xml中,配置如下:

  1. <!--引入SpringMVC的核心控制器DispatchServlet-->
  2. <servlet>
  3. <servlet-name>servlet</servlet-name>
  4. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  5. <!--配置SpringMVC的核心配置文件-->
  6. <init-param>
  7. <param-name>contextConfigLocation</param-name>
  8. <param-value>classpath:spring/springmvc-context.xml</param-value>
  9. </init-param>
  10. </servlet>
  11. <!--配置Spring监听器启动,在服务器启动的时候最先启动-->
  12. <listener>
  13. <listener-class>
  14. org.springframework.web.context.ContextLoaderListener
  15. </listener-class>
  16. </listener>
  17. <!--配置SpringMVC核心配置文件-->
  18. <context-param>
  19. <param-name>contextConfigLocation</param-name>
  20. <param-value>classpath:spring/spring-context.xml</param-value>
  21. </context-param>
  22. <!-- 访问DispatcherServlet对应的路径 -->
  23. <!--配置Servlet映射,默认/ 不是/*-->
  24. <servlet-mapping>
  25. <servlet-name>servlet</servlet-name>
  26. <url-pattern>/</url-pattern> <!--/不过滤jsp防止死循环-->
  27. </servlet-mapping>

2.5、配置SpringMVC的核心配置文件

按照上面web.xml中的配置,我们需要springmvc-context.xml中做如下配置:

  1. <?xml version='1.0' encoding='UTF-8'?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:p="http://www.springframework.org/schema/p"
  5. xmlns:context="http://www.springframework.org/schema/context"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context.xsd">
  11. <!--配置SpringMVC包的扫描,因为当前springmvc也是使用了容器,所以它扫描的组件不能和spring扫描的组件重复-->
  12. <context:component-scan base-package="com.fd.controller" use-default-filters="false">
  13. <!--所以要使用排除法,SpringMVC只扫描自己的controller包-->
  14. <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
  15. </context:component-scan>
  16. </beans>

注意:配置SpringMVC包的扫描,因为当前springmvc也是使用了容器,所以它扫描的组件不能和spring扫描的组件重复,所以在spring扫描的时候,要把controller取消扫描。

修改spring的核心配置文件spring-context.xml如下:

  1. <!-- 配置spring包扫描 -->
  2. <context:component-scan base-package="com.fd">
  3. <!--因为controller已经在springMVC中扫描过了,所以在spring扫描的时候,要把controller过滤掉-->
  4. <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
  5. </context:component-scan>

再到springmvc-context.xml中加入视图解析器,注册驱动等,完整的springmvc-context.xml中配置文件如下:

  1. <?xml version='1.0' encoding='UTF-8'?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:p="http://www.springframework.org/schema/p"
  5. xmlns:context="http://www.springframework.org/schema/context"
  6. xmlns:mvc="http://www.springframework.org/schema/mvc"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
  11. <!--配置SpringMVC包的扫描,因为当前springmvc也是使用了容器,所以它扫描的组件不能和spring扫描的组件重复-->
  12. <context:component-scan base-package="com.fd.controller" use-default-filters="false">
  13. <!--所以要使用排除法,SpringMVC只扫描自己的controller包-->
  14. <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
  15. </context:component-scan>
  16. <!-- 视图解析器 -->
  17. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  18. <!-- jsp所在的位置-->
  19. <property name="prefix" value="/WEB-INF/jsp/"/>
  20. <!-- jsp文件的后缀名-->
  21. <property name="suffix" value=".jsp"/>
  22. </bean>
  23. <!--配置默认的servlet-->
  24. <mvc:default-servlet-handler/>
  25. <!--启用注解驱动-->
  26. <mvc:annotation-driven/>
  27. </beans>

2.6、编程测试Controller

编写一个测试Servlet,用来测试SpringMVC是否正常启动

  1. @Controller
  2. public class IndexController {
  3. @RequestMapping("/hello")
  4. @ResponseBody
  5. public String test() throws Exception{
  6. return "Hello F2135";
  7. }
  8. }

这时在浏览器输入http://localhost:8080/hello 如果浏览器输出Hello F2135,则表示SpringMVC启动成功!

2.7、编程验证SpringMVC和Spring完全整合成功

因为Spring和SpringMVC是两个容器,另外SpringMVC的容器时Spring容器的子容器,所以当SpringMVC的Controller中如果注入Spring的Bean成功,那么我们就可以验证SpringMVC和Spring完全整合。

先编写一个Service接口:

  1. public interface UserService {
  2. public User getUser();
  3. }

再编写一个Service实现类:

  1. @Service
  2. public class UserServiceImpl implements UserService {
  3. @Override
  4. public User getUser() {
  5. return null;
  6. }
  7. }

在IndexController中通过@Autowired注入UserService,如果注入成功,那么久说明Spring和SpringMVC整合成功。

代码如下:

  1. @Controller
  2. public class IndexController {
  3. @Autowired
  4. private UserService userService;
  5. @RequestMapping("/user")
  6. @ResponseBody
  7. public String getUser() throws Exception{
  8. final User user = userService.getUser();
  9. return user.toString();
  10. }
  11. }

注意:如果返回JSON格式数据,那么要在SpringMVC中配置对JSON的支持,默认要jackson框架,如果是Spring5,加入的依赖版本是2.12.3,如果使用的是Spring4,默认依赖版本是2.8.9左右版本,如下:

  1. <!--加入jackson来完成SpringMVC对JSON的解析-->
  2. <dependency>
  3. <groupId>com.fasterxml.jackson.core</groupId>
  4. <artifactId>jackson-databind</artifactId>
  5. <version>2.12.3</version>
  6. </dependency>

2.8、在Spring中调用MyBatis

因为MyBatis完全由Spring接管,所以MyBatis的Dao要通过容器注入,注入和测试如下:

  1. @Service
  2. public class UserServiceImpl implements UserService {
  3. // 注入MyBatis的Dao对象
  4. @Autowired
  5. private UserDao userDao;
  6. @Override
  7. public User getUser() {
  8. final User user = userDao.getUser("16");
  9. return user;
  10. }
  11. }

测试没有问题,接下来就可以完成一个项目了。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号