Spring 整合MyBatis

204 阅读6分钟

Spring 整合MyBatis

整合Mybatis和Spring的目的就是能够从Spring容器中获得Mybatis提供的类的实例。
本文希望通过整合Spring和Mybatis来完成简单的增删改查,所以需要使用的Mybatis提供的实例是Mapper接口的实例,所以我们要在Sping的配置文件中配置MapperScannerConfigurer,让MapperScannerConfigurer去扫描Mapper接口,自动生成Mapper接口的实现类,并将实现类注册到Spring中,这样我们就可以从Spring容器中获得Mapper接口的实例。
MapperScannerConfigurer需要SqlSessionFactory来为Mapper接口的实例提供SqlSession,所以我们要在Sping的配置文件中配置SqlSessionFactoryBean。
SqlSessionFactoryBean需要数据源,所以我们又在Sping的配置文件中配置了BasicDataSource。

创建Maven工程

依赖文件如下

<dependencies>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-dbcp2</artifactId>
        <version>2.6.0</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.2</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-dao</artifactId>
        <version>2.0.8</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.2</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>
</dependencies>

创建spring的配置文件application.xml

在resources文件夹下创建spring的配置文件application.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-4.0.xsd">
</beans>

使用DBCP配置数据源

我们需要为Mybatis提供数据源

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/baozi" />
    <property name="username" value="root" />
    <property name="password" value="root" />
    <!--连接池的最大数据库连接数 -->
    <property name="maxTotal" value="255" />
    <!--最大等待连接中的数量 -->
    <property name="maxIdle" value="5" />
    <!--最大等待毫秒数 -->
    <property name="maxWaitMillis" value="10000" />
</bean>

配置SqlSessionFactoryBean

在单独使用Mybatis时需要使用SqlSessionFactoryBuilder来创建SqlSessionFactory。在整合Mybatis和Spring时,需要使用Mybatis-Spring提供的SqlSessionFactoryBean来为Mybatis提供SqlSessionFactory,下面这个简单的配置了Mybatis的数据源和Mybatis配置文件的位置

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:mybatis-config.xml" />
</bean>

配置MapperScannerConfigurer

MapperScannerConfigurer用来自动扫描Mapper接口类, Mybatis会扫描指定的package下的接口类,自动为这些接口生成实现类并将这些实现类注册到Spring中,这样就可以在spring容器中拿到这个接口类的实现类的对象。

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <!-- 指定扫描的根目录,Mybatis会递归的扫描该文件夹下的Mapper接口 -->
    <property name="basePackage" value="com.baozi.mapper"/>
    <!-- 指定生成的Mapper类的使用的SqlSessionFactory -->
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    <!-- 只等只有使用@Repository注解的类才会被扫描(可以不配置) -->
    <property name="annotationClass" value="org.springframework.stereotype.Repository"/>
</bean>

创建Mybatis的配置文件mybatis-config.xml

在resources文件夹下创建Mybatis的配置文件mybatis-config.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" />
        <!-- 允许 JDBC 支持生成的键。需要适合[修改为:适当]的驱动。如果设置为true,则这个设置强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如 Derby) -->
        <setting name="useGeneratedKeys" value="true" />
        <!-- 配置默认的执行器。SIMPLE 执行器没有什么特别之处。REUSE 执行器重用预处理语句。BATCH 执行器重用语句和批量更新  -->
        <setting name="defaultExecutorType" value="REUSE" />
        <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 设置超时时间,它决定驱动等待一个数据库响应的时间  -->
        <setting name="defaultStatementTimeout" value="25000"/>
    </settings>
    <!-- 别名配置 -->
    <typeAliases>
        <typeAlias alias="role" type="com.baozi.pojo.Role" />
    </typeAliases>

    <!-- 指定映射器路径 -->
    <mappers>
        <mapper resource="com/baozi/mapper/RoleMapper.xml" />
    </mappers>
</configuration>

创建POJO类

package com.baozi.pojo;

public class Role {
	
	private Long id;
	private String roleName;
	private String note;
	
	//省略了getter/setter方法
	
}

创建Mapper接口

因为在配置MapperScannerConfigurer时配置了只有使用@Repository注解的接口才能被扫描到,所以要使用spring提供的@Repository来注解接口

package com.baozi.mapper;

import com.baozi.pojo.Role;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

@Repository
public interface RoleMapper {

    public int insertRole(Role role);

    public Role getRole(@Param("id") Long id);

    public int updateRole(Role role);

    public int deleteRole(@Param("id") Long id);

}

创建Mapper.xml文件

在resources/com/baozi/mapper/路径下创建RoleMapper.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.baozi.mapper.RoleMapper">

    <insert id="insertRole">
        insert into t_role(id, role_name, note) values(#{id}, #{roleName}, #{note})
    </insert>

    <delete id="deleteRole" parameterType="long">
        delete from t_role where id = #{id}
    </delete>

    <update id="updateRole" parameterType="role">
        update t_role
        set role_name = #{roleName},
            note = #{note}
        where id = #{id}
    </update>
    
    <select id="getRole" parameterType="long" resultType="role">
        select id, role_name as roleName, note from t_role where id = #{id}
    </select>

</mapper>

测试

建表语句

create table t_role(
    id int(12) not null,
    role_name varchar(60) not null,
    note varchar(256) null,
    primary key(id)
);

测试类

package com.baozi;

import com.baozi.mapper.RoleMapper;
import com.baozi.pojo.Role;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:application.xml");
        RoleMapper roleMapper = ctx.getBean(RoleMapper.class);
        // insert
        Role role = new Role();
        role.setId(1L);
        role.setRoleName("lisi");
        role.setNote("bat man");
        System.out.println("exec insert: " + role);
        roleMapper.insertRole(role);
        // select
        role = roleMapper.getRole(role.getId());
        System.out.println("insert result: " + role);
        // update
        role.setNote("super man");
        System.out.println("exec update: " + role);
        roleMapper.updateRole(role);
        role = roleMapper.getRole(role.getId());
        System.out.println("update result: " + role);
        // delete
        System.out.println("exec delete: " + role);
        roleMapper.deleteRole(role.getId());
        role = roleMapper.getRole(role.getId());
        System.out.println("delete result:" + role);
    }

}

测试结果

总结

整合Mybatis和Spring的目的就是能够从Spring容器中获得Mybatis提供的类的实例。本文希望通过整合Spring和Mybatis来完成简单的增删改查,所以需要使用的Mybatis提供的实例是Mapper接口的实例,所以我们要在Sping的配置文件中配置MapperScannerConfigurer,让MapperScannerConfigurer去扫描Mapper接口,自动生成Mapper接口的实现类,并将实现类注册到Spring中,这样我们就可以从Spring容器中获得Mapper接口的实例。 MapperScannerConfigurer需要SqlSessionFactory来为Mapper接口的实例提供SqlSession,所以我们要在Sping的配置文件中配置SqlSessionFactoryBean。
SqlSessionFactoryBean需要数据源,所以我们又在Sping的配置文件中配置了BasicDataSource。