1、MyBatis-Spring整合

1、查看不同MyBatis版本整合Spring时使用的适配包

http://mybatis.org/spring/

2、整合文档

http://mybatis.org/spring/getting-started.html

3、开始整合

1、创建maven项目

image.png

2、完整的pom文件

(1)修改打包方式为war

(2)添加包

  • springMVC
  • spring-jdbc
  • mybatis-spring
  • mybatis
  • mysql驱动(mysql-connector-java)
  • servlet-api(javax.servlet-api)
  • thymeleaf-spring5(模板引擎)
  • druid(数据库连接池)
  • jackson(jackson-databind)json处理
  • logback-classic(日志) ```xml <?xml version=”1.0” encoding=”UTF-8”?> <project xmlns=”http://maven.apache.org/POM/4.0.0

    1. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4.0.0

    com.daijunyi ssm-03 1.0-SNAPSHOT

    war

      <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
      <!--        springMVC-->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.3.9</version>
      </dependency>
    
      <!--        jdbc-->
      <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>5.3.9</version>
      </dependency>
    
      <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
      <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis-spring</artifactId>
          <version>2.0.6</version>
      </dependency>
    
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.26</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf-spring5 -->
    <dependency>
        <groupId>org.thymeleaf</groupId>
        <artifactId>thymeleaf-spring5</artifactId>
        <version>3.0.12.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.6</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.9</version>
    </dependency>

    <!--aspects aop模块-->
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>5.3.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.20</version>
        <scope>provided</scope>
    </dependency>

    <!-- 日志工具 -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>

</dependencies>

  <!--maven项目默认是不会把src目录下源码文件中的xml文件编译打包进jar中,
如果我们要把xml文件放在和mapper的类在同一个包下,那我们需要把xml文件打包指定打包-->
<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

<a name="6zbFL"></a>
### 3、添加项目目录和文件夹
<a name="udo9m"></a>
#### (1)添加webapp目录

- 用来放web相关的文件

![image.png](https://cdn.nlark.com/yuque/0/2021/png/12971636/1628696425933-64f50d28-3191-4f76-ba04-38a869958697.png#align=left&display=inline&height=336&margin=%5Bobject%20Object%5D&name=image.png&originHeight=672&originWidth=820&size=69623&status=done&style=none&width=410)
<a name="GTtG3"></a>
#### (2)添加web.xml文件
![image.png](https://cdn.nlark.com/yuque/0/2021/png/12971636/1628696483508-4cb7f17c-acb6-4bb9-a794-397046de4021.png#align=left&display=inline&height=336&margin=%5Bobject%20Object%5D&name=image.png&originHeight=672&originWidth=912&size=242381&status=done&style=none&width=456)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12971636/1628696573765-c86d6737-ba8a-4d37-ad59-a9f8cc33df84.png#align=left&display=inline&height=851&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1702&originWidth=2076&size=406620&status=done&style=none&width=1038)<br />修改web.xml文件目录为在webapp下<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12971636/1628696624586-76a220c2-5da2-43a7-abc7-528bb205198d.png#align=left&display=inline&height=673&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1346&originWidth=2642&size=581932&status=done&style=none&width=1321)
<a name="AJKrG"></a>
#### (3)添加templates文件夹
![image.png](https://cdn.nlark.com/yuque/0/2021/png/12971636/1628696733920-8f19705e-75f3-4c28-b498-c14549250c3b.png#align=left&display=inline&height=311&margin=%5Bobject%20Object%5D&name=image.png&originHeight=622&originWidth=692&size=46030&status=done&style=none&width=346)
<a name="ccjRK"></a>
#### (4)添加applicationContext.xml(spring的启动配置文件)
![image.png](https://cdn.nlark.com/yuque/0/2021/png/12971636/1628696820917-78545e43-2b12-4fee-8e1f-7b891aeb673d.png#align=left&display=inline&height=696&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1392&originWidth=2014&size=504073&status=done&style=none&width=1007)

<a name="o8ZDY"></a>
#### (5)同样方式添加spring-mvc.xml
![image.png](https://cdn.nlark.com/yuque/0/2021/png/12971636/1628697000867-ef074704-9a75-4310-8352-f2cad2e06b06.png#align=left&display=inline&height=83&margin=%5Bobject%20Object%5D&name=image.png&originHeight=166&originWidth=528&size=14559&status=done&style=none&width=264)
<a name="5JAG5"></a>
#### (6)添加db.propeties
![image.png](https://cdn.nlark.com/yuque/0/2021/png/12971636/1628697138086-80937c28-d28a-4541-be5f-1fed8799a510.png#align=left&display=inline&height=77&margin=%5Bobject%20Object%5D&name=image.png&originHeight=154&originWidth=430&size=13429&status=done&style=none&width=215)<br />并且配置数据库信息

jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/learn jdbc.username=root jdbc.password=qwerasdf123

<a name="3M0Fp"></a>
#### (7)创建mybatis-config.xml文件
![image.png](https://cdn.nlark.com/yuque/0/2021/png/12971636/1628697250391-02ddc5d8-693e-47c2-957d-f9d3db0ec5e5.png#align=left&display=inline&height=120&margin=%5Bobject%20Object%5D&name=image.png&originHeight=240&originWidth=486&size=20990&status=done&style=none&width=243)<br />并且添加配置信息<br />[相关配置可点击mybatis文档查看](https://mybatis.org/mybatis-3/zh/configuration.html)
```xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!--        开启缓存-->
        <setting name="cacheEnabled" value="true"/>
                <!--开启下划线和驼峰命名自动映射-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!--显示的指定延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>
</configuration>

(8)添加包名com.daijunyi

image.png

4、配置web.xml

(1)添加 tomcat的启动监听器,并且启动spring 并且加载spring配置文件

<!--配置context启动可加载参数-->
<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--配置监听器启动spring 容器-->
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

(2)配置springMVC的DispatchServlet

<!--配置springMVC的DispatchServlet-->
<servlet>
  <servlet-name>SpringMVC</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <!--指定springMvc的配置文件-->
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-mvc.xml</param-value>
  </init-param>
</servlet>

<!--    监听所有的路径 除了.jsp的文件-->
<servlet-mapping>
  <servlet-name>SpringMVC</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

(3)完整配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--配置context启动可加载参数-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <!--配置监听器启动spring 容器-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!--配置springMVC的DispatchServlet-->
    <servlet>
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--指定springMvc的配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
    </servlet>

    <!--    监听所有的路径 除了.jsp的文件-->
    <servlet-mapping>
        <servlet-name>SpringMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

5、配置spring-mvc.xml文件

(1)添加context和mvc的命名空间

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

</beans>

(2)开启mvc的包扫描,但是只扫描controller组件

<!--开启包扫描,关闭默认的扫描过滤器,导入只扫描Controller组件-->
<context:component-scan base-package="com.daijunyi" use-default-filters="false">
  <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

(3)创建一个thmyeleaf模板解析器

<!--视图解析器-->
<!-- 配置Thymeleaf视图解析器 -->
<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
  <property name="order" value="1"/>
  <property name="characterEncoding" value="UTF-8"/>
  <property name="templateEngine">
    <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
      <property name="templateResolver">
        <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">

          <!-- 视图前缀 -->
          <property name="prefix" value="/WEB-INF/templates/"/>

          <!-- 视图后缀 -->
          <property name="suffix" value=".html"/>
          <property name="templateMode" value="HTML5"/>
          <property name="characterEncoding" value="UTF-8" />
        </bean>
      </property>
    </bean>
  </property>
</bean>

(4)添加mvc注解驱动和静态资源处理器

    <!--注解驱动-->
    <mvc:annotation-driven/>
    <!--静态文件访问处理器 当所有请求地址都没批到到的时候最终会去匹配看看是否有静态文件可以访问-->
    <mvc:default-servlet-handler/>

(5)完整配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--开启包扫描,关闭默认的扫描过滤器,导入只扫描Controller组件-->
    <context:component-scan base-package="com.daijunyi" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--视图解析器-->
    <!-- 配置Thymeleaf视图解析器 -->
    <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
        <property name="order" value="1"/>
        <property name="characterEncoding" value="UTF-8"/>
        <property name="templateEngine">
            <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
                <property name="templateResolver">
                    <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">

                        <!-- 视图前缀 -->
                        <property name="prefix" value="/WEB-INF/templates/"/>

                        <!-- 视图后缀 -->
                        <property name="suffix" value=".html"/>
                        <property name="templateMode" value="HTML5"/>
                        <property name="characterEncoding" value="UTF-8" />
                    </bean>
                </property>
            </bean>
        </property>
    </bean>

    <!--注解驱动-->
    <mvc:annotation-driven/>
    <!--静态文件访问处理器 当所有请求地址都没批到到的时候最终会去匹配看看是否有静态文件可以访问-->
    <mvc:default-servlet-handler/>
</beans>

6、配置applicationContext.xml文件

(1)添加命名空间

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">

</beans>

(2)开启除Controller组件之外的spring组件扫描

<!--开启除Controller组件之外的spring组件扫描-->
<context:component-scan base-package="com.daijunyi">
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

(3)配置数据库连接池

<!--引入数据库配置文件-->
<context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
<!--配置数据库连接池druid-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
  <property name="driverClassName" value="${jdbc.driver}"/>
  <property name="url" value="${jdbc.url}"/>
  <property name="username" value="${jdbc.username}"/>
  <property name="password" value="${jdbc.password}"/>
</bean>

(4)配置spring事物

<!--配置事物管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean>
<!--开启事物管理-->
<tx:annotation-driven transaction-manager="transactionManager"/>

(5)配置mybatis

<!--配置mybatis spring的整合-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource"/>
  <!--        指定mybatis的配置文件-->
  <property name="configLocation" value="classpath:mybatis-config.xml"/>
  <!--        指定映射文件地址-->
  <property name="mapperLocations" value="classpath:com/daijunyi/mapper/*.xml"/>
</bean>
<!--开启mapper注解扫描-->
<mybatis-spring:scan base-package="com.daijunyi.mapper"/>

(6)完整配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx   http://www.springframework.org/schema/tx/spring-tx.xsd
http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd">

    <!--扫描-->
    <context:component-scan base-package="com.daijunyi">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--导入外部属性文件-->
    <context:property-placeholder location="classpath:database.properties"></context:property-placeholder>

    <!--配置数据源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${druid.driver}"></property>
        <property name="url" value="${druid.url}"></property>
        <property name="username" value="${druid.username}"></property>
        <property name="password" value="${druid.password}"></property>
    </bean>

    <!--事物管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--开启事物-->
    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

    <!--整合mybatis spring 管理所有组件
        1、使用
    -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!--指定配置文件-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!--指定映射文件-->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
    </bean>

    <!--扫描所有mapper接口的实现,让这些mapper能够自动注入-->
    <mybatis-spring:scan base-package="com.daijunyi.mapper"/>
</beans>

7、创建java业务代码

(1)创建各层包名

image.png

(2)创建user.java

@ToString
@Data
public class User implements Serializable {
    private static final long serialVersionUID = -7175233610366539872L;
    private Integer userId;
    private String userName;
    private Integer uStatus;
}

(3)创建UserMapper.java

public interface UserMapper {
    List<User> getUserList();
}

(4)创建UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.daijunyi.mapper.UserMapper">

    <!--    List<User> getUserList();-->
    <select id="getUserList" resultType="com.daijunyi.model.User">
        select * from `user`
    </select>
</mapper>

(5)创建UserService.java

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public List<User> getUserList(){
        return userMapper.getUserList();
    }
}

(6)创建UserController.java

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/user/list")
    public Object getUserList(){
        return userService.getUserList();
    }
}

8、测试

(1)配置添加本地tomcat

image.pngimage.png
image.pngimage.png

(2)运行

http://localhost:8080/SSM/user/list
image.png

9、重点说明

(1)如果UserMapper.xml和UserMappe.java在同一个包名下,需要在pom.xml文件中指定要打包xml文件

    <!--maven项目默认是不会把src目录下源码文件中的xml文件编译打包进jar中,
    如果我们要把xml文件放在和mapper的类在同一个包下,那我们需要把xml文件打包指定打包-->
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>