环境搭建和依赖导入

Spring是支持无缝整合MyBatis的,首先需要导入依赖和搭建环境:

  1. <dependencies>
  2. <!--junit包-->
  3. <dependency>
  4. <groupId>junit</groupId>
  5. <artifactId>junit</artifactId>
  6. <version>4.12</version>
  7. </dependency>
  8. <!--mybatis依赖-->
  9. <dependency>
  10. <groupId>org.mybatis</groupId>
  11. <artifactId>mybatis</artifactId>
  12. <version>3.5.2</version>
  13. </dependency>
  14. <!--jdbc依赖-->
  15. <dependency>
  16. <groupId>mysql</groupId>
  17. <artifactId>mysql-connector-java</artifactId>
  18. <version>8.0.23</version>
  19. </dependency>
  20. <!--spring需要的依赖-->
  21. <dependency>
  22. <groupId>org.springframework</groupId>
  23. <artifactId>spring-webmvc</artifactId>
  24. <version>5.1.10.RELEASE</version>
  25. </dependency>
  26. <!--spring需要的依赖-->
  27. <dependency>
  28. <groupId>org.springframework</groupId>
  29. <artifactId>spring-jdbc</artifactId>
  30. <version>5.1.10.RELEASE</version>
  31. </dependency>
  32. <!--aspectJ AOP 织入器-->
  33. <dependency>
  34. <groupId>org.aspectj</groupId>
  35. <artifactId>aspectjweaver</artifactId>
  36. <version>1.9.4</version>
  37. </dependency>
  38. <!--mybatis-spring整合包-->
  39. <dependency>
  40. <groupId>org.mybatis</groupId>
  41. <artifactId>mybatis-spring</artifactId>
  42. <version>2.0.2</version>
  43. </dependency>
  44. </dependencies>
<!--配置Maven静态资源过滤问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

配置spring-dao.xml配置文件:

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

    <!--配置数据源:数据源有非常多,可以使用第三方的,也可使使用Spring的-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url"
                  value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/>
        <property name="username" value="root"/>
        <property name="password" value="wujiahao269139"/>
    </bean>

    <!--配置SqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--连接数据源-->
        <property name="dataSource" ref="dataSource"/>
        <!--关联Mybatis配置文件,可以理解为引入mybatis-config.xml-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!--注册映射器,即xxxMapper.xml,这一步无需再到mybatis-config.xml中注册 
        xxxMapper.xml-->
        <property name="mapperLocations" value="classpath:com/wjh/dao/*.xml"/>
    </bean>


    <!--注册sqlSessionTemplate,相当于mybatis中的sqlSession 关联sqlSessionFactory-->
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <!--利用构造器注入-->
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    </bean>

    <!--注册Bean-->
    <bean id="userMapper" class="com.wjh.dao.UserMapperImpl">
        <!--给属性注入值-->
        <property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
    </bean>
</beans>

可以看到spring-dao.xml的配置完成可以配置mybatis-config.xml文件,其实mybatis-confiig.xml配置文件可以完全不需要,但是为了体现mybatis,mybatis-confiig.xml文件通常用于配置settings和别名:

<?xml version="1.0" encoding="utf8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--核心配置文件-->
<configuration>

    <settings>
        <!--     配置mybatis自动开启驼峰映射-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

    <typeAliases>
        <package name="com.wjh"/>
    </typeAliases>

</configuration>

前面提到SqlSessionTemplate,在spring中,我们需要为dao接口写一个实现类,其中的一个属性就需要包含sqlSessionTemplate来进行数据的增删改查,而这个属性必须具有set方法来注入值,如:

package com.wjh.dao;

import com.wjh.po.User;
import org.mybatis.spring.SqlSessionTemplate;

import java.util.List;

/**
 * @author wjh
 * @date 2021/7/17 21:35
 * @Package com.wjh.dao
 */
public class UserMapperImpl implements UserMapper{
   private SqlSessionTemplate sqlSessionTemplate;  //私有化

    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSessionTemplate = sqlSessionTemplate;
    }

    @Override
    public List<User> listUser() {
        UserMapper userMapper=sqlSessionTemplate.getMapper(UserMapper.class);
        return userMapper.listUser();
    }
}

配置解析

Spring要和MyBatis一起使用,需要在Spring上下文中定义至少两样东西:SqlSessionFactory和至少一个数据映射器类(是一个负责将数据库中的一行数据映射到一个对象的类,在mybatis-spring中使用SqlSessionTemplate)。

SqlSessionFactory配置

在mybatis-spring中使用SqlSessionFactoryBean来创建SqlSessionFactory,即上述配置的:

<!--配置SqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--连接数据源-->
        <property name="dataSource" ref="dataSource"/>
        <!--关联Mybatis配置文件-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!--注册映射器,即xxxMapper.xml-->
        <property name="mapperLocations" value="classpath:com/wjh/dao/*.xml"/>
    </bean>

首先,SqlSessionFactory需要一个数据源,这里就是上述配置的id为dataSource数据源:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url"
                  value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/>
        <property name="username" value="root"/>
        <property name="password" value="wujiahao269139"/>
 </bean>

然后,如果mybatis-config.xml配置文件存在的话,我们还需要关联配置文件(configLocation属性),也就是:

<property name="configLocation" value="classpath:mybatis-config.xml"/>

如果mybatis的xxxMapper.xml文件也在改文件注册(使用mapperLocations属性),则:

<property name="mapperLocations" value="classpath:com/wjh/dao/*.xml"/>

上面的*.xml代表com.wjh.dao包下面的所有xml文件

SqlSessionTemplate配置

SqlSessionTemplate是无缝代替mybatis中的SqlSession的类,是mybatis-spring的核心类,它由SqlSessionFactory使用构造器注入完成注入:

<!--注册sqlSessionTemplate,相当于mybatis中的sqlSession 关联sqlSessionFactory-->
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <!--利用构造器注入-->
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    </bean>

最后就是需要注册接口的实现类了,而接口的实现需要注入SqlSessionTemplate属性,比如:

<!--注册Bean-->
    <bean id="userMapper" class="com.wjh.dao.UserMapperImpl">
        <!--给属性注入值,即注入上面的sqlSessionTemplate(org.mybatis.spring.SqlSessionTemplate)-->
        <property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
    </bean>

属性名是sqlSessionTemplate,注入的值是上面id为sqlSessionTemplate的Bean,然后就可以使用sqlSessionTemplate来进行增删改查:

public class UserMapperImpl implements UserMapper{
    private SqlSessionTemplate sqlSessionTemplate;

    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSessionTemplate = sqlSessionTemplate;
    }

    @Override
    public List<User> listUser() {
        UserMapper userMapper=sqlSessionTemplate.getMapper(UserMapper.class);
        return userMapper.listUser();
    }
}

这就是spring-dao.xml的一些配置解析,用来配置mybatis-spring的使用,专注于持久层的配置,一般不用于其它配置,在spring的主配置文件导入spring-dao即可:

<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!--导入spring-dao.xml-->
    <import resource="spring-dao.xml"/>

    <!--设置支持注解-->
    <context:annotation-config/>

    <!--设置扫描的包-->
    <context:component-scan base-package="com.wjh"/>

</beans>

上述通过配置文件注入SqlSessionTemplate是一种方式,而mybatis-spring1.2.3版新增加了一种获取SqlSessionTemplate的方法:是dao接口的实现类继承SqlSessionDaoSupport类,直接使用其中的getSqlSession方法获取SqlSessionTemplate即可,这一的话配置文件需要作一定的修改:

 <!--注册sqlSessionTemplate , 关联sqlSessionFactory-->
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <!--利用构造器注入-->
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    </bean>

    <!--注册Bean-->
    <bean id="userMapper" class="com.wjh.dao.UserMapperImpl">
        <!--给属性注入值,即注入上面的sqlSessionTemplate(org.mybatis.spring.SqlSessionTemplate)-->
        <property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
    </bean>

修改成:

    <!--注册Bean-->
    <bean id="userMapper" class="com.wjh.dao.UserMapperImpl">
        <!--sqlSessionTemplate属性变为sqlSessionFactory属性,注入SqlSessionTemplate的         
        实例对象变为注入SqlSessionFactory的实例对象-->
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>

下面是SqlSessionDaoSupport类的源码:

public abstract class SqlSessionDaoSupport extends DaoSupport {
    private SqlSessionTemplate sqlSessionTemplate;

    public SqlSessionDaoSupport() {
    }

    public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
        if (this.sqlSessionTemplate == null || sqlSessionFactory != this.sqlSessionTemplate.getSqlSessionFactory()) {
            this.sqlSessionTemplate = this.createSqlSessionTemplate(sqlSessionFactory);
        }

    }

    protected SqlSessionTemplate createSqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    public final SqlSessionFactory getSqlSessionFactory() {
        return this.sqlSessionTemplate != null ? this.sqlSessionTemplate.getSqlSessionFactory() : null;
    }

    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSessionTemplate = sqlSessionTemplate;
    }

    public SqlSession getSqlSession() {
        return this.sqlSessionTemplate;
    }

    public SqlSessionTemplate getSqlSessionTemplate() {
        return this.sqlSessionTemplate;
    }

    protected void checkDaoConfig() {
        Assert.notNull(this.sqlSessionTemplate, "Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required");
    }
}