Spring 整合 Mybatis

时间:2022-07-25
本文章向大家介绍Spring 整合 Mybatis,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、MyBatis 单独开发

第一个问题就是配置文件繁琐。

如果使用 MyBatis 配置文件的方式开发,配置文件会非常的繁琐:

<configuration>
    <typeAliases>
        <typeAlias type="edu.lsu.mybatis.User" alias="user"/>
    </typeAliases>
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC&amp;useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="UserDaoMapper.xml"/>
    </mappers>
</configuration>

如上:

  • 我们需要配置别名,有几个写几个;
  • 我们需要注册 mapper,有几个写几个。

有同学说可以使用 package 标签解决这个问题。

是的,但是我们待会使用 Spring 的方式解决这个问题。

第二个问题就是在调用 API 的时候存在代码冗余:

@Test
public void test1() throws IOException {
    InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
    SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
    SqlSession session = ssf.openSession();
    UserDao userDao = session.getMapper(UserDao.class);
    
    User user = new User();
    user.setName("ws");
    user.setPassword("123456");
    userDao.saveUser(user);
    session.commit();
}

这里创建 SqlSessionFactory 的代码是固定的,变化的部分只有 getMapper 时需要传入的参数。

二、Spring 与 Mybatis 的整合思路

Spring 主要是对这 4 行代码进行了封装:

InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);

SqlSession session = ssf.openSession();
UserDao userDao = session.getMapper(UserDao.class);

前两行

首先是封装了创建 SqlSessionFactory 的方式,然后封装了创建 Dao 的实现类。

原来是需要 mybatis-config.xml 配置文件的,现在去掉了,但是我们还是需要给它提供配置文件里的内容信息,比如 数据源 、别名、Mapper 的注册信息。

SqlSessionFactoryBean :

  • 用于封装 SqlSessionFactory 创建的代码;
  • 需要数据源 、别名、注册信息作为参数;
  1. 数据源可以使用 ref 引用存在的数据源信息;
  2. 别名可以使用包名,Spring会自动为包下的实体类创建别名:首字母小写;
  3. 注册信息可以使用通配的设置,如:*Mapper.xml

后两行

Spring 提供了一个 MapperScannerConfig 类,他需要几个属性:

  • 首先是需要一个 SqlSessionFactoryBean ,用于获取 session
  • 然后设置 Dao 接口所在的包,他会自动扫描包下的接口并创建 Dao 对象,它的 id 值是接口首字母小写。

三、整合编码实现

在 Spring 的配置文件中:

<?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">
<!--    连接池-->
    <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC&amp;useSSL=false&amp;characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>
<!--    SqlSessionFactoryBean-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="typeAliasesPackage" value="edu.lsu.entity"/>
        <property name="mapperLocations">
            <list>
                <value>classpath:edu/lsu/mapper/*Mapper.xml</value>
            </list>
        </property>
    </bean>
<!--    创建Dao对象-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" id="scanner">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
        <property name="basePackage" value="edu.lsu.dao"/>
    </bean>
</beans>

其余文件内容均不变,在测试的时候即可测试出结果:

@Test
public void test2() {
    ApplicationContext ac = new ClassPathXmlApplicationContext("/application.xml");
    UserDao userDao = ac.getBean("userDao", UserDao.class);
    User user = new User();
    user.setName("小贱人");
    user.setPassword("99999");
    userDao.saveUser(user);
}