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提供的接口,用于处理持久化框架的异常。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • NHibernate 缓存

    NHibernate 缓存NHibernate支持两种级别的缓存,即一级缓存以及二级缓存。一级缓存一级缓存就是ISession缓存,在ISession的生命周期内可用,多个ISession之间不能共享缓存的对象,通过ISessionFactory创建的ISession默认支持一级缓存,不需要特殊的配置。在NHibernate的参考文档中,对ISession的描述如下:

  • Dreamweaver2019版安装教程

    Dreamweaver2019版安装教程dreamweavercc2019新功能:1、CEF更新dreamweavercc2019现已与Chromium嵌入式框架的最新版本进行集成,这样设计人员和开发人员就可以构建与HTML5兼容的网站,并显示Flexbox元素、CSS网格等内容。2、ES6支持全新的EcmaScript6支持包括类、方法、箭头函数、生成器函数的快速输入列表,以及ES6代码的lint…

  • 面试题总结 —— JAVA高级工程师

    面试题总结 —— JAVA高级工程师面试题总结——JAVA高级工程师近期考虑换工作的问题,于是投简历面试,面试5家公司的高级Java工程师,有4家给了我offer,想着总结一下面试经验,方便最近正在寻求机会的你们一、无笔试题不知道是不是职位原因还是没遇到,面试时,都不需要做笔试题,而是填张个人信息表格,或者直接面试二、三大框架方面问题1、Spring事务的隔离性,并说说每个隔离性的…

  • c语言建立二叉树的算法代码(C语言数据结构二叉树实现)

    构造二叉树结点结构typedefstructBT{chardata;structBT*l_chrild;structBT*r_chrild;}BT;创建二叉树BT*Create_tree()//创建二叉树{BT*bt;charx;scanf(“%c”,&x);getchar();if(x

  • RTSP协议学习笔记

    RTSP协议学习笔记第一部分:RTSP协议一、       RTSP协议概述RTSP(Real-TimeStreamProtocol)是一种基于文本的应用层协议,在语法及一些消息参数等方面,RTSP协议与HTTP协议类似。RTSP被用于建立的控制媒体流的传输,它为多媒体服务扮演“网络远程控制”的角色。尽管有时可以把RTSP控制信息和媒体数据流交织在一起传送,但一般情况RTSP本身并不用于转送媒体流数据

    2022年10月23日
  • 创业之路_小项目创业网

    创业之路_小项目创业网美国《时代周刊》评论曾经有这样一段话,“在21世纪,改变你命运的只有你自己,别期盼有人会来帮助你。从现在开始,‘学习、改变、创业’是通往新世界的唯一道路”。决心创业并已参加培训的学员勇敢地迈出了第一步,只要能吃苦耐劳,勇于开拓,勤于学习,坚忍不拔,一定能实现自己心中的目标。创业,是一个发现和捕捉机会,并由创造出新颖的产品,提升服务,实现其潜在价值的过程。创业能否成功,与创业者的素质…

发表回复

您的电子邮箱地址不会被公开。

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