Mybatis:了解SqlSessionTemplate[通俗易懂]

Mybatis:了解SqlSessionTemplate[通俗易懂]读完这篇文章,你将会知道:SqlSessionTemplate和SqlSessionManager有什么不同。 SqlSessionTemplate如何实现线程安全。 SqlSessionTemplate怎么和数据库打交道。目录SqlSessionTemplate和SqlSessionManager有什么不同。SqlSessionTemplate如何实现线程安全…

大家好,又见面了,我是你们的朋友全栈君。

读完这篇文章,你将会知道:

  • SqlSessionTemplate 和 SqlSessionManager 有什么不同。
  • SqlSessionTemplate 如何实现线程安全。
  • SqlSessionTemplate 怎么和数据库打交道。

目录

SqlSessionTemplate 和 SqlSessionManager 有什么不同。

SqlSessionTemplate 如何实现线程安全

SqlSessionTemplate 怎么和数据库打交道

ExecutorType:Executor的类型

PersistenceExceptionTranslator:处理持久化框架的异常


SqlSessionTemplate 和 SqlSessionManager 有什么不同

SqlSessionTemplate是Mybatis为了接入Spring提供的Bean。通过TransactionSynchronizationManager中的ThreadLocal<Map<Object, Object>>保存线程对应的SqlSession,实现session的线程安全。

SqlSessionManager是Mybatis不接入Spring时用于管理SqlSession的Bean。通过SqlSessionManagger的ThreadLocal<SqlSession>实现session的线程安全。

Mybatis:了解SqlSessionTemplate[通俗易懂]

 

SqlSessionTemplate里面有4个类变量

字段  类型  描述
sqlSessionFactory SqlSessionFactory session工厂
executorType ExecutorType Executor的类型:SIMPLE, REUSE, BATCH
sqlSessionProxy SqlSession SqlSession代理对象,注册了SqlSessionInterceptor反射处理器,实际上的方法调用都是通过SqlSessionInterceptor反射实现的。
exceptionTranslator PersistenceExceptionTranslator Spring提供的接口,用于处理持久化框架的异常

 

SqlSessionTemplate实际上是通过内部类SqlSessionInterceptor提供的反射功能去执行具体的操作。

下图是SqlSessionTemplate的构造函数中,sqlSessionProxy的构建方式,通过注册SqlSessionInterceptor这个反射处理器去执行SqlSession中的方法。

Mybatis:了解SqlSessionTemplate[通俗易懂]

SqlSessionTemplate 如何实现线程安全

在进行反射的时候,invoke通过getSqlSession方法拿到DefaultSqlSession实例,getSqlSession方法里面处理了sqlSession的线程安全问题(通过ThreadLocal实现)。

Mybatis:了解SqlSessionTemplate[通俗易懂]

 

Mybatis:了解SqlSessionTemplate[通俗易懂]下面详细讲解 getSqlSession() 是如何工作的:

(1)getSqlSession方法中,在资源同步管理器上获取资源(SqlSessionHolder),SqlSessionHolder实际上可认为是SqlSession的一层包装

Mybatis:了解SqlSessionTemplate[通俗易懂]

(2)在TransactionSynchronizationManager.getResource方法中,根据key生成一个autualKey,然后通过doGetResource方法获得对应的SqlSessionHolder。

Mybatis:了解SqlSessionTemplate[通俗易懂]

(3)在doGetResource(key)中,会用到resources这个 ThreadLocal<Map<Object, Object>> 对象,每个线程通过维护自己的recources资源(包括SqlSessionHolder)来保证线程安全。

Mybatis:了解SqlSessionTemplate[通俗易懂]

Mybatis:了解SqlSessionTemplate[通俗易懂]

 

SqlSessionTemplate 怎么和数据库打交道

SqlSessionTemplate不直接和数据库打交道,实际上SqlSessionTemplate调用的还是DefaultSqlSession这个类,由DefaultSqlSession去做具体的事情。

 

那么SqlSessionTemplate中的DefaultSqlSession是怎么来的呢?

我们继续看getSqlSession方法,在getSqlSession中,如果当前线程拿不到session,就是调用sqlSessionFacatory的opernSession方法,开启一个会话。

Mybatis:了解SqlSessionTemplate[通俗易懂]

在SqlSessionTemplate中,sqlSessionFacatory实际上的实现是“DefaultSqlSessionFacatory”。
sessionFactory会创建事务、Executor,最终生成一个新的DefualtSqlSession对象。

Mybatis:了解SqlSessionTemplate[通俗易懂]

 

ExecutorType:Executor的类型

类型 实例化对象 描述
SIMPLE SimpleExecutor 每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
REUSE ReuseExecutor 可复用Statement。执行update或select时,使用sql作为key在 Map<String, Statement> statementMap 中获得Statement(Statement或PrepareStatement),存在就使用,不存在就创建;用完后,不关闭Statement对象。
BATCH BatchExecutor 批量执行update(jdbc批处理不支持select)。

PersistenceExceptionTranslator:处理持久化框架的异常

Spring提供的接口,用于处理持久化框架的异常。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138246.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • security protected_license server detected什么意思

    security protected_license server detected什么意思http://3g.365jia.cn/js/riot.min.jshttp://a.adnium.com/static?r=23326206&id=94837&pid=5044&sid=73633&tid=1&w=300&h=250http://aaa.1688zl.top/static/bottom.jshttp://ca2.hnzz-zhuor…

    2025年11月24日
    3
  • matlab fmincon函数格式,求助 fmincon 函数调用格式说明

    matlab fmincon函数格式,求助 fmincon 函数调用格式说明functionKineticsEstclearallclck0=[0.50.50.50.50.5];%参数初值lb=[00000];%参数下限ub=[+inf+inf+inf+inf+inf];%参数上限x0=[0.18830.25070.0467…

    2022年5月10日
    34
  • iOS安全攻防(三):使用Reveal分析他人app

    iOS安全攻防(三):使用Reveal分析他人app

    2021年12月7日
    38
  • yarn的安装和使用(yarn安装mysql)

    升级yarn升级指定版本(例:升级到v1.22.10版本)yarnupgradev1.22.10npmyarn安装/升级最新版本npminstallyarn@latest-g查看yarn历史版本npmviewyarnversions–json[“0.1.0″,”0.1.1″,”0.1.2″,”0.1.3″,”0.15.1″,”0.16.0″,”0.16.1″,”0.17.0”,”0.17…

    2022年4月13日
    71
  • BN层代码实现_无代码

    BN层代码实现_无代码BatchNormalization开发环境项目代码结构生成虚拟数据程序神经网络构建带初始化模型的神经网络构建带BN的FC网络和不带BN的FC网络对比不同初始化方式带BN的网络模型对比开发环境python–3.7torch–1.8+cu101torchsummarytorchvision–0.6.1+cu101PILnumpyopencv-pythonpillow项目代码结构src文件夹存储了带有BN的FC训练文件、基于初始化的带BN的FC训练文件以及BN在训练阶段的操作。t

    2022年10月14日
    3
  • ubuntu16.04分区方案设置(新装的ubuntu没有网络驱动)

    linux分区设置。法一:Swap(相当于电脑内存):逻辑分区、大小设置为电脑内存大小,2G,4G;/boot(引导分区):主分区:大小设置为200M;/home(用户存储数据用):逻辑分区,要尽可能大,100G空间可以设置为85G,留10G给主分区即可。/.(主分区):主分区,用于存放系统,相当于win7的C盘,10G即可。法二:/.(主分区):主分区,只分这一个区,…

    2022年4月14日
    56

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号