mybatis与spring的整合之SqlSessionTemplate
使用 SqlSession
- 在
MyBatis
中,你可以使用 SqlSessionFactory 来创建 SqlSession。一旦你获得一个session
之后,你可以使用它来执行映射语句,提交或回滚连接。最后,当不再需要它的时候, 你可以关闭session
。 - 使用
MyBatis-Spring
之后, 你不再需要直接使用 SqlSessionFactory 了,因为你的bean
可以通过一个线程安全的 SqlSession 来注入,基于Spring
的事务配置来自动提交、回滚、关闭session
。
SqlSessionTemplate
SqlSessionTemplate 是 MyBatis-Spring
的核心。 这个类负责管理 MyBatis
的 SqlSession, 调用 MyBatis
的 SQL
方法, 翻译异常。 SqlSessionTemplate 是线程安全的, 可以被多个 DAO
所共享使用。
当调用 SQL
方法时, 包含从映射器 getMapper()
方法返回的方法, SqlSessionTemplate 将会保证使用的 SqlSession 是和当前 Spring
的事务相关的。此外,它管理 session
的生命 周期,包含必要的关闭,提交或回滚操作。
SqlSessionTemplate 实现了 SqlSession 接口,这就是说,在代码中无需对 MyBatis
的 SqlSession 进行替换。 SqlSessionTemplate 通常是被用来替代默认的 MyBatis
实现的 DefaultSqlSession , 因为模板可以参与到 Spring
的事务中并且被多个注入的映射器类所使 用时也是线程安全的。相同应用程序中两个类之间的转换可能会引起数据一致性的问题。
SqlSessionTemplate 对象可以使用 SqlSessionFactory 作为构造方法
的参数来创建。
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
源码
SqlSessionTemplate只有构造方法注入
,没有setter
方法
SqlSessionTemplate构造方法
一个入参
这是用得最多
的构造方法,注入一个SqlSessionFactory
sqlSessionFactory.getConfiguration().getDefaultExecutorType()
,获取Configuration默认的executorType
,为SIMPLE
。Configuration的初始化可详见mybatis与spring的整合之SqlSessionFactoryBean
public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
this(sqlSessionFactory, sqlSessionFactory.getConfiguration().getDefaultExecutorType());
}
两个入参
一般执行批量操作时需要改变executorType
为BATCH
MyBatisExceptionTranslator是异常转换器
public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType) {
this(sqlSessionFactory, executorType, new MyBatisExceptionTranslator(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), true));
}
三个入参
一般都是SqlSessionTemplate内部自己调用,完成属性赋值
其中最重要的是sqlSessionProxy
,通过JDK
动态 代理创建的session
,执行sql
语句是通过这个代理对象完成的<