本文将利用 Spring 对 MyBatis 进行整合, 在对组件实现解耦的同时, 还能使 MyBatis 框架的使用变得更加方便和简单.
整合思路
作为 Bean 容器, Spring 框架提供了 IoC 机制, 可以接管所有组件的创建工作并进行依赖管理, 因为整合的主要工作就是把 MyBatis 框架使用中所涉及的核心组件配置到 Spring 容器中, 交给 Spring 来创建和管理.
具体来说, 业务逻辑对象依赖基于 MyBatis 技术实现的 DAO 对象, 核心是获取 SqlSession 实例. 要获得 SqlSession 实例, 则需要依赖 SqlSessionFactory 实例. 而 SqlSessionFactory 是 SqlSessionFactoryBuilder 依据 MyBatis 配置文件中的数据源, Sql 映射文件等信息来构建的.
现在, 我们只需把以上流程全部移交给 Spring, 发挥 Spring 框架 Bean 容器的作用, 就能接管组件的创建工作, 管理组件的生命周期, 并对组件之间的依赖关系进行解耦合管理.
准备工作
1. 在项目中加入 Spring,MyBatis 及整合相关的 JAR 文件
Spring 整合 MyBatis 所需 jar 包
我已上传到百度云网盘, 大家可以点击这里下载 https://pan.baidu.com/s/14BDjBipeTGdqafCp-xjJ7w , 密码: xlk3
2. 建立开发目录结构, 创建实体类
3. 创建数据访问接口
4. 配置 SQL 映射文件
为 IUserMapper 配置 SQL 语句映射文件 IUserMapper.xml, 实现指定的查询映射.
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="cn.xxxx.mapper.IUserMapper">
- <select id="queryAll" resultType="USER">
- select * from user
- </select>
- </mapper>
5. 配置 MyBatis 配置文件
编写 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>
- <!-- 类型别名 -->
- <typeAliases>
- <package name="cn.xxxx.pojo" />
- </typeAliases>
- </configuration>
这里的 MyBatis 配置文件内容与之前相比简单了许多, 这是因为 Spring 可以接管 MyBatis 配置信息的维护工作. 我们选择把数据源配置和 SQL 映射信息转移至 Spring 配置文件中进行管理.
实现整合
Spring 需要依次完成加载 MyBatis 配置信息, 构建 SqlSessionFactory 和 SqlSession 实例, 完成对业务逻辑对象的依赖注入等工作. 这些工作大多以配置文件的方式实现, 无须编写相关类.
配置数据源
对于任何持久化解决方案, 数据库连接都是首先要解决的问题. 在 Spring 中, 数据源作为一个重要的组件可以单独进行配置和维护. 我们将 MyBatis 配置文件中有关数据源的配置移除, 转移到 Spring 配置文件中进行维护.
这里以配置 dbcp 数据源为例
- <!-- 数据源 -- 数据库连接池管理 dbcp -->
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
- <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
- <property name="url" value="jdbc:mysql://localhost:3306/smbms"></property>
- <property name="username" value="root"></property>
- <property name="password" value="ok"></property>
- </bean>
配置 SqlSessionFactoryBean
在 MyBatis 中, SqlSessionFactory 的实例需要使用 SqlSessionFactoryBuilder 创建; 而在集成环境中, 则可以使用 MyBatis-Spring 整合包中的 SqlSessionFactoryBean 来代替. SqlSessionFactoryBean 封装了使用 SqlSessionFactoryBuilder 创建 SqlSessionFactory 的过程, 我们可以在 Spring 中以配置文件的形式, 通过配置 SqlSessionFactoryBean 获得 SqlSessionFactory 实例.
- <!-- sqlSession 工厂 -->
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <!-- 引用数据源组件 -->
- <property name="dataSource" ref="dataSource"></property>
- <!-- 引用 MyBatis 配置文件中的配置 -->
- <property name="configLocation" value="classpath:mybatis_config.xml"></property>
- <!-- 配置 SQL 映射文件信息 -->
- <property name="mapperLocations" value="classpath:cn/xxxx/mapper/*.xml"></property>
- </bean>
通过上个示例配置的 id 为 SqlSessionFactory 的 Bean 即可获得 SqlSessionFactory 实例.
示例中 "classpath:cn/xxxx/mapper/*.xml" 表示扫描 cn.xxxx.mapper 包及其任意层级的子包中, 任意名称的 xml 类型的文件.
使用 SqlSessionTemplate 实现数据库的操作
对于 MyBatis 而言, 得到 SqlSessionFactory 实例, 就可以进一步获取 SqlSession 实例进行数据库操作. 而在集成环境中, 为了更好地使用 SqlSession, 充分利用 Spring 框架提供的服务, MyBatis-Spring 整合包提供了 SqlSessionTemplate 类.
SqlSessionTemplate 类实现了 MyBatis 的 SqlSession 接口, 可以替换 MyBatis 中原有的 SqlSession 实现类提供数据库访问操作.
配置 SqlSessionTemplate
在 IUserMapper 实现类使用注解进行注入, 代码如下
- @Repository("userMapper")
- public class UserMapper implements IUserMapper {
- @Resource(name="sqlSessionTemplate")
- private SqlSessionTemplate template;
- @Override
- public List<USER> queryAll() {
- return template.getMapper(IUserMapper.class).queryAll();
- }
- }
Spring 配置文件代码如下:
- <!-- 配置 SqlSessionTemplate -->
- <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
- <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
- </bean>
- <context:component-scan base-package="cn.xxxx.*" />
- <aop:aspectj-autoproxy />
注意:
1) 创建 SqlSessionTemplate 实例时, 需要通过其构造方法注入 SqlSessionFactory 实例. 这里引用的是前文配置过的 id 为 SqlSessionFactory 的 Bean.
2) 与 MyBatis 中默认的 SqlSession 实现不同, SqlSessionTemplate 是线程安全的, 可以以单例模式配置并被多个 DAO 对象共用, 而不必为每个 DAO 单独配置一个 SqlSessionTemplate 实例.
编写业务逻辑代码
- import java.util.List;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Qualifier;
- import org.springframework.stereotype.Service;
- import cn.xxxx.mapper.IUserMapper;
- import cn.xxxx.pojo.USER;
- import cn.xxxx.service.IUserService;
- @Service("userSerivce")
- public class UserService implements IUserService{
- @Autowired
- @Qualifier("userMapper")
- private IUserMapper userMapper;
- @Override
- public List<USER> queryAll() {
- return userMapper.queryAll();
- }
- }
这里使用注解实现组件注入, 测试方法省略....
下次更新注入映射器实现和事务功能
来源: https://www.cnblogs.com/xiaotie666/p/LiujinSpring_MyBatisSummary.html