MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。


1. MyBatis-Spring 的基本工作原理

SqlSessionFactoryBean

与原生的 MyBatis 不同的是,在 MyBatis-Spring 中创建 SqlSessionFactory 的是 SqlSessionFactoryBean,而不再需要 SqlSessionFactoryBuilder 了。

在 Spring 中,只需要在应用中配置好 SqlSessionFactoryBean 后,Spring 就会在应用启动时为你创建 SqlSessionFactory 实例

配置 SqlSessionFactoryBean

在配置 SqlSessionFactoryBean 时需要注意几个关键的属性。

dataSource 属性

dataSource 属性是唯一一个必须设置的属性,这与 MyBatis 配置中的数据源一样,是对数据库相关的配置。

configLocation 属性

configLocation 属性是一个常用的属性,它是用来指定 MyBatis 配置文件位置的。但是这并不需要一个完整的配置,因为 Spring 会忽略其中的环境配置(),SqlSessionFactoryBean 会创建它自有的 MyBatis 环境配置。比如:上面的 dataSource 属性就决定了环境配置中的数据源配置,所以 Spring 就不会再去加载配置文件中的数据源配置了。

mapperLocations 属性

mapperLocations 属性是用来指定 MyBatis 的 XML 配置文件的位置的。如果 Spring 找不到 XML 映射文件,那么需要在 MyBatis 配置文件中设置,或者使用该属性设置。

一个简单的配置 SqlSessionFactoryBean 例子:

@Bean
public SqlSessionFactory sqlSessionFactory() {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource());
return factoryBean.getObject();
}

SqlSessionDaoSupport

通常,在 MyBatis-Spring 中不需要直接使用 SqlSessionFactory 。因为 SqlSessionFactory 会被注入到MapperFactoryBean 或其它继承于 SqlSessionDaoSupport 的 DAO 中。

SqlSessionDaoSupport 是一个抽象的支持类,用来为你提供 SqlSession。调用 getSqlSession() 方法你会得到一个 SqlSessionTemplate 实例,之后可以用于执行 SQL 方法

使用 SqlSession

在 SqlSessionFactory 被注入到 SqlSessionDaoSupport 后,紧接着 SqlSessionFactory 又会被注入到一个 SqlSessionTemplate 中。

SqlSessionTemplate

SqlSessionTemplate 是 MyBatis-Spring 的核心,最终 SqlSessionFactory 就是被注入到这里。这是一个线程安全的 SqlSession ,它能基于 Spring 的事务配置来自动提交、回滚、关闭 session。

SqlSessionTemplate 负责管理 SqlSessionFactory 的 session 生命周期,包含必要的关闭、提交或回滚操作。另外,它也负责将 MyBatis 的异常翻译成 Spring 中的 DataAccessExceptions。

图解 MyBatis-Spring 的基本工作原理

根据上面讲解作出此图,以便理解:

mybatis-spring core


2. MyBatis-Spring 与 MyBatis 对比

创建 SqlSessionFactory

MyBatis

在 MyBatis 中,SqlSessionFactory 是通过 SqlSessionFactoryBuilder 和 MyBatis 配置文件创建的。SqlSessionFactoryBuilder 会根据配置文件中的信息创建出具有不同行为的 SqlSessionFactory。

MyBatis-Spring

在 MyBatis-Spring 中,SqlSessionFactory 是通过 SqlSessionFactoryBean 创建的。SqlSessionFactoryBean 也可以通过配置文件创建具有不同行为的 SqlSessionFactory ,但是会忽略其中的环境配置。SqlSessionFactoryBean 会根据数据源属性创建自有 MyBatis 的环境配置。

SqlSessionFactory 的去向

MyBatis

因为 SqlSessionFactory 管理着 MyBatis 所有的配置信息,所以 SqlSessionFactory 会在应用运行期间一直存在,所以一般会用单例模式来管理 SqlSessionFactory 。

MyBatis-Spring

而在 MyBatis-Spring 中 SqlSessionFactory 会被注入到 SqlSessionTemplate 中,作为 SqlSessionFactory 代理管理其session 的生命周期。

访问数据库

MyBatis

通过 SqlSessionFactory 获取 SqlSession 来访问数据库。

MyBatis-Spring

SqlSessionTemplate 内部会管理 SqlSessionFactory 的 session 生命周期,包含必要的关闭、提交或回滚操作。所以直接使用 SqlSessionTemplate 访问数据库。


参考文献:

MyBatis 官方文档

评论