- 0. 前言
- 1. Spring对SqlSessionTemplate的管理
- 1.1. SqlSessionTemplate的创建:
- 1.2. MapperProxy中sqlSession的来源:
- 2. SqlSessionInterceptor中的getSqlSession
0. 前言
- 众所周知😏:MyBatis通过SqlSessionFactory 创建SqlSession去调用Executor执行器进行JDBC数据库操作
- SqlSession在Mybatis中有DefaultSqlSession、SqlSessionManagger两种实现,其中SqlSessionManagger是线程安全的
SqlSessionTemplate
是Mybatis为了接入Spring提供的Bean,也是SqlSession的实现,并且是线程安全的- 关于DefaultSqlSession为什么不是线程安全可以参考链接
1. Spring对SqlSessionTemplate的管理
1.1. SqlSessionTemplate的创建:
- 在自动配置的时候会默认创建SqlSessionTemplate并放入IOC容器中,当然前提我们没有手动去配置这个bean
- SqlSessionTemplate构造函数中会对SqlSession进行代理,也就是SqlSessionTemplate持有SqlSession的代理对象
1.2. MapperProxy中sqlSession的来源:
- 上一篇文章:SpringBoot整合Mybatis的核心原理 中介绍到,Mapper接口调用时会触发代理类MapperProxy的invoke方法,而且代理类MapperProxy是持有sqlSession的
- MapperProxy是持有sqlSession实际就是SqlSessionTemplate
@Service("sysUserService")
public class SysUserServiceImpl implements SysUserService {
@Resource
private SysUserMapper sysUserMapper;
@Override
public SysUser queryById(Long id) {
return sysUserMapper.queryById(id);
}
}
- 上一篇文章中有介绍到,属性填充sysUserMapper时,会往IOC容器生成MapperFactoryBean,其类图如下
- 就意味着,生成MapperFactoryBean也会属性填充sqlSessionFactory和sqlSessionTemplate
- 所以从容器中的sqlSessionTemplate属性填充到MapperFactoryBean
- 所以通过MapperFactoryBean的getObject创建代理对象时,获取的sqlSession就是sqlSessionTemplate
2. SqlSessionInterceptor中的getSqlSession
- 上文知道mapper接口的调用最终会通过sqlSessionTemplate进行调用,而sqlSessionTemplate持有sqlSession的代理对象
- 那么调用的时候就会触发代理类的invoke方法
- invoke通过getSqlSession方法拿到DefaultSqlSession实例
- getSqlSession方法里面处理了sqlSession的线程安全问题(通过ThreadLocal实现)
- 由此可见:sqlSessionTemplate并不去参与JDBC数据库操作,实际还是通过DefaultSqlSession来进行JDBC数据库操作
- 具体怎么操作的后续再进行介绍