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。