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 会忽略其中的环境配置(
mapperLocations 属性
mapperLocations 属性是用来指定 MyBatis 的 XML 配置文件的位置的。如果 Spring 找不到 XML 映射文件,那么需要在 MyBatis 配置文件中设置,或者使用该属性设置。
一个简单的配置 SqlSessionFactoryBean 例子:
|
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 的基本工作原理
根据上面讲解作出此图,以便理解:
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 访问数据库。
参考文献: