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的来源:

@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的介绍及创建过程的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis源码分析-IDEA新建MyBatis源码工程

Mybatis源码解析Mybatis源码体系结构

Mybatis 源码:Mybatis配置解析

MyBatis源码解读——SqlSessionFactory

MyBatis源码分析环境准备

MyBatis源码分析五MyBatis的缓存