Mybatis源码 - SqlSessionTemplate的介绍及创建过程
Posted 做猪呢,最重要的是开森啦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis源码 - SqlSessionTemplate的介绍及创建过程相关的知识,希望对你有一定的参考价值。
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数据库操作
- 具体怎么操作的后续再进行介绍
以上是关于Mybatis源码 - SqlSessionTemplate的介绍及创建过程的主要内容,如果未能解决你的问题,请参考以下文章