Mybatis:了解SqlSessionTemplate

2023-11-03

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

  • 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的线程安全。

 

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中的方法。

SqlSessionTemplate 如何实现线程安全

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

 

下面详细讲解 getSqlSession() 是如何工作的:

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

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

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

 

SqlSessionTemplate 怎么和数据库打交道

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

 

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

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

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

 

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis:了解SqlSessionTemplate 的相关文章

  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐

  • k8s nginx .yaml 测试

    apiVersion apps v1 kind Deployment metadata name nginx test spec replicas 2 selector matchLabels app nginx test template
  • c++中,什么时候用 A a;和什么时候用A a=new A;

    说明 此处内容是在网上摘抄的 总结一下 为了以后查找方面 new是在堆上分配内存 它需要用delete释放 否则会造成内存泄漏 使用的内存没有即时释放 造成内存的浪费 而A a在右大括号执行后 会自动释放内存 如 int main A a
  • Matlab funnction函数定义及常见扩展应用(@函数句柄,feval函数等)

    目录 MATLAB函数定义 1 函数文件 调用函数文件 定义多个M文件 2 函数文件 子函数 定义一个具有多个子函数的M文件 3 Inline 无需M文件 直接定义 4 匿名函数 5 Syms subs 无需M文件 直接定义 6 字符串 s
  • 数据持久化(Json,二进制,PlayerPrefs)

    数据持久化 文章目录 数据持久化 数据持久化概述 1 数据持久化 JSON 1 Json简介 2 JsonUtility相关知识点 3 LitJson相关知识 4 JsonMgr管理器的书写 2 数据持久化 二进制 1 二进制简介 2 文件
  • Nodejs之Buffer数据转ReadSteam

    当要处理的是一个文件时 stream fs createReadStream content txt 返回一个readStream 文件读取流 输入流 对象 可读流 当处理的是一个Buffer时 用createReadStream就会报错
  • 移动端接口加密

    最近公司写的android接口需要加密 防止被恶意攻击 2加密规则想了个简单的办法 传两个参数 一个是string类型的另一种是MD5加密的密文 在服务端写个拦截器 或者过滤器去拦截他 然后做自己相应的逻辑处理 把string类型的字段拿过
  • 操作系统进程知识概括

    操作系统进程知识概括 进程概述 线程 处理机调度 进程同步 进程互斥 信号量机制 进程互斥同步经典问题 管程 死锁 进程概述 进程概述 程序 是静态的 就是个存放在磁盘里的 可执行文件 就是一系列的指令集合 进程 Process 是动态的
  • OnnxRunTime遇到FAIL : Non-zero status code returned while running BatchNormalization node.

    遇到FAIL Non zero status code returned while running BatchNormalization node 跑onnxruntime时 发现显卡没有用到 pip install onnxruntim
  • Linux中的ssize_t

    2023年7月12日 周三上午 概述 ssize t 是一个数据类型 用于表示有符号的大小 它通常在文件操作和网络编程中用作函数的返回类型或参数类型 头文件 ssize t 在
  • EasyPoi导出 导入(带校验)简单示例 EasyExcel

    官方文档 http doc wupaas com docs easypoi pom的引入
  • 厉害了!知道这样重命名文件都是大佬级别!

    大家好 我是良许 在 Linux 下 重命名一个文件 我们通常是使用 mv 命令 一般是这样操作的 mv file1 txt file2 txt 这样重命令的方式当然是可以 但有个弊端就是你需要输入两次文件名 文件名比较短还好 一旦比较长的
  • zotero 使用方法

    zotero 使用方法总结 前言 zotero 免费开源 功能强大 插件丰富 使用方便 zotero支持多种方式导入文件包括直接拖拽pdf导入文档 DOI arXiv号或从剪切板导入 同时能够使用sci hub 文献下载神器 下载参考文献
  • springboot项目中使用Swagger

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 1 Swagger是啥 Swagger 是一个用于生成 描述和调用 RESTful 接口的 Web 服务 通俗的来讲 Swagger 就是将项目中所有 想要暴露的 接口展现在
  • 【Jmeter】调用java接口进行压测报no cookies问题

    Jmeter 调用java接口进行压测报no cookies问题 问题图片 解决办法 问题图片 解决办法 我的java接口返回参数是json格式 所以要选择如下图所示 最终返回正确的json格式 不在有no cookies问题
  • 线性分类模型(二):logistic回归模型分析

    前言 上一篇文章介绍了线性判别模型 本文介绍线性生成模型 logistic回归模型 本文介绍logstic回归模型相关的知识 为了更好理解模型的决策边界函数 本文同时分析了多元变量的协方差对概率分布的影响 目录 1 logistic回归模型
  • java内存模型

    https www cnblogs com chenpi p 5159558 html
  • 哈希碰撞

    一 什么是哈希碰撞 所谓哈希 hash 就是将不同的输入映射成独一无二的 固定长度的值 又称 哈希值 它是最常见的软件运算之一 如果不同的输入得到了同一个哈希值 就发生了 哈希碰撞 collision 二 哈希碰撞产生原理 举个例子 假设要
  • IDEA更改主题插件——Material Theme UI详解

    原文地址 文章目录 IDEA更改主题插件 Material Theme UI 一 安装 二 设置 1 主设置 1 主题 2 突出颜色 2 高级设置之选项卡 3 高级设置之compact 4 高级设置之图标 icons 关于icons不能使用
  • 导出错误EXP-00091: Exporting questionable statistics

    今天在客户那儿在数据库服务器上导出数据时发生EXP 00091 看看帮助 oracle localhost backup oerr exp 9100091 00000 Exporting questionable statistics Ca
  • Mybatis:了解SqlSessionTemplate

    读完这篇文章 你将会知道 SqlSessionTemplate 和 SqlSessionManager 有什么不同 SqlSessionTemplate 如何实现线程安全 SqlSessionTemplate 怎么和数据库打交道 目录 Sq