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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • id nfc模拟_手机NFC也可以刷ID卡门禁?无聊测试居然成功了

    id nfc模拟_手机NFC也可以刷ID卡门禁?无聊测试居然成功了前段时间换了个K20pro,有NFC功能后手又痒了,就想折腾一下NFC的日常使用。小区的门禁前几个月刚换成了亲邻开门,可以用微信小程序开门,但每次都要拿手机出来点几下(特别是手机提着东西的时候),还是没有手机接触式开门方便。拿出家里的门禁卡放手机背面,没反应,我NFC应该没问题呀!换另外一台华为手机还是没反应!上网一查,我家的门禁卡居然是ID卡!但还是不死心,在小米钱包里虚拟了一张门卡,放到小区门…

    2022年6月8日
    266
  • verycd下载办法_flac格式用什么播放器

    verycd下载办法_flac格式用什么播放器VeryCD的下载服务昨天晚上停掉了,和电影、剧集并列VeryCD三大板块的音乐从它的主页面上彻底抹掉了,如果不是这一年来VeryCD着力开拓了在线视频和类SNS服务的话,电影和剧集想来在昨晚也就一齐倒掉了。  VeryCD的命运其实在09年底BTchina被关掉的时候就能想象得到了,从那时起,VeryCD也就加快了转型的速度,面上的转型是“去盗版化”,除了SNS和在线播放业务外,这一年可

    2022年8月10日
    7
  • pycharm中使用pyinstaller 来打包程序「建议收藏」

    pycharm中使用pyinstaller 来打包程序「建议收藏」本章是有关pyqt5最后一个简单的东西了,目前我使用pyqt5还是比较少的,如果以后需要其他项目的时候在记录吧,也是对2020年最后一天的结束吧。首先通过pycharm下载pyinstaller.下载后添加额外工具:name为:pyinstallerDescription:forpacketwindowsexeprogram:找到那安装包路径Argument中写:-F-w$FileNameWithoutExtension$.pyworki…

    2022年8月28日
    4
  • ubuntu安装qt5.7无响应_ubuntu虚拟机安装教程

    ubuntu安装qt5.7无响应_ubuntu虚拟机安装教程一.下载和安装wgethttp://download.qt.io/official_releases/qt/5.7/5.7.0/qt-opensource-linux-x64-5.7.0.run下载后给执行权限chmod+xqtxxxx.run安装./qtxxxx.run二.配置环境1.安装g++sudoapt-getinstallb

    2022年10月15日
    2
  • Odin Inspector 系列教程 — Dictionary Drawer Settings Attribute[通俗易懂]

    Odin Inspector 系列教程 — Dictionary Drawer Settings Attribute[通俗易懂]DictionaryDrawerSettings自定义字典绘制方式默认以左侧为key,右侧为value的形式展示,如果需要进行序列化,需要继承自SerializedMonoBehaviour[DictionaryDrawerSettings()][ShowInInspector][InfoBox(“为了序列化字典,我们需要做…

    2022年7月21日
    17
  • Cannot set the value of read-only property ‘outputFile’多渠道打包和All flavors must now belong to a named

    Cannot set the value of read-only property ‘outputFile’多渠道打包和All flavors must now belong to a named

    2021年9月30日
    35

发表回复

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

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