MyBatis 源码分析--获取SqlSession
前言:
前文我们从源码层面梳理了 SqlSessionFactory 的创建过程,本篇我们继续分析一下 SqlSession 的获取过程。
初识 MyBatis 【MyBatis 核心概念】
案例代码:
public class MyBatisTest {@Testpublic void test() throws IOException {//读取配置文件InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//创建 SqlSessionFactoryBuilder 对象SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();//通过 SqlSessionBuilder 对象 解析 mybatis-config.xml 文件 构建一个SqlSessionFactory SqlSessionFactory sqlSessionFactory = builder.build(is);//通过SqlSessionFactory构建一个SqlSessionSqlSession session = sqlSessionFactory.openSession();//通过SqlSession 获取 Mapper 实例UserMapper userMapper = session.getMapper(UserMapper.class);//获取数据List<User> users = userMapper.findAll();//打印输出for (User user : users) {System.out.println(user);}//关闭资源session.close();is.close();}
}
本篇我们将主要对 sqlSessionFactory.openSession() 这句代码进行分析。
获取 SqlSession 源码分析
DefaultSqlSessionFactory#openSession 方法源码分析
DefaultSqlSessionFactory#openSession 方法只是调用了 DefaultSqlSessionFactory#openSessionFromDataSource 方法,并传入了默认的执行器类型、隔离级别、是否自动提交参数。
//org.apache.ibatis.session.defaults.DefaultSqlSessionFactory#openSession()
public SqlSession openSession() {//使用默认的执行器类型(默认是SIMPLE) 默认隔离级别 非自动提交 委托给 openSessionFromDataSource 方法return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false);
}
执行器类型
- SIMPLE:简单执行器 SimpleExecutor,每执行一条 SQL,都会打开一个 Statement,执行完成后会关闭。
- REUSE:重用执行器 ReuseExecutor,其内部会缓存一个 Map<String, Statement> ,每次编译完成的 Statement 都会进行缓存,不会关闭,可以重复使用。
- BATCH:批量执行器,基于 JDBC 的 addBatch、executeBatch 功能,只能作用于 insert、update、delete 语句。
- CachingExecutor:缓存执行器,使用了装饰器模式,在开启缓存的时候,会在上面三种执行器上包装一层 CachingExecutor。
package org.apache.ibatis.session;public enum ExecutorType {SIMPLE,REUSE,BATCH;private ExecutorType() {}
}
DefaultSqlSessionFactory#openSessionFromDataSource 方法源码分析
DefaultSqlSessionFactory#openSessionFromDataSource 方法逻辑很简单,先获取创建 SqlSession 的必要参数,然后调用 DefaultSqlSession 的构造方法创建了 SqlSession 。
//org.apache.ibatis.session.defaults.DefaultSqlSessionFactory#openSessionFromDataSource
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {//事务Transaction tx = null;//SqlSessionDefaultSqlSession var8;try {//获取环境Environment environment = this.configuration.getEnvironment();//获取事务工厂TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(environment);//获取一个事务tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);//根据 事务 和 执行器类型创建一个执行器Executor executor = this.configuration.newExecutor(tx, execType);//根据配置 执行器 事务提交方式创建一个默认的 SqlSessionvar8 = new DefaultSqlSession(this.configuration, executor, autoCommit);} catch (Exception var12) {this.closeTransaction(tx);throw ExceptionFactory.wrapException("Error opening session. Cause: " + var12, var12);} finally {ErrorContext.instance().reset();}return var8;
}//org.apache.ibatis.session.defaults.DefaultSqlSession#DefaultSqlSession(org.apache.ibatis.session.Configuration, org.apache.ibatis.executor.Executor, boolean)
public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {this.configuration = configuration;this.executor = executor;this.dirty = false;this.autoCommit = autoCommit;
}
Configuration#newExecutor 方法源码分析
Configuration#newExecutor 主要是对执行器类型进行判断,然后生成执行器,并通过动态代理得到代理对象,并将执行器加入拦截器链。
//org.apache.ibatis.session.Configuration#newExecutor
public Executor newExecutor(Transaction transaction, ExecutorType executorType) {executorType = executorType == null ? this.defaultExecutorType : executorType;executorType = executorType == null ? ExecutorType.SIMPLE : executorType;Object executor;//执行器类型判断if (ExecutorType.BATCH == executorType) {executor = new BatchExecutor(this, transaction);} else if (ExecutorType.REUSE == executorType) {executor = new ReuseExecutor(this, transaction);} else {executor = new SimpleExecutor(this, transaction);}//是否开启缓存if (this.cacheEnabled) {//开启缓存 创建缓存执行器executor = new CachingExecutor((Executor)executor);}//责任链模式 将执行器加入拦截器链 使用JDK动态代理增强所有的拦截器 Executor executor = (Executor)this.interceptorChain.pluginAll(executor);return executor;
}
获取 SqlSession 的源码很简单,希望可以帮助到有需要的小伙伴。
欢迎提出建议及对错误的地方指出纠正。
相关文章:
MyBatis 源码分析--获取SqlSession
前言: 前文我们从源码层面梳理了 SqlSessionFactory 的创建过程,本篇我们继续分析一下 SqlSession 的获取过程。 初识 MyBatis 【MyBatis 核心概念】 案例代码: public class MyBatisTest {Testpublic void test() throws IOException {/…...
Upload-Labs:Pass - 1(JS前端白名单)
Pass_1 1. 上传测试2. 代码审计**获取文件输入的值**:**检查是否选择了文件**:**定义允许的文件类型**:**提取文件的扩展名**:**检查文件类型是否允许上传**:**构建错误消息并提醒用户**: 3.绕过思路3.1 将…...
vue大作业-实现学校官网
vue大作业-实现学校官网 基于vue2实现的学校官网 项目展示 学校官网介绍 欢迎访问我们学校的官方网站,这里为您提供了全面的信息和资源,帮助您更好地了解我们的教育理念、教学资源和学术活动。 首页 首页是您了解我们学校的起点。这里展示了学校的最…...
24面试记录002
文章目录 12、brpc的优化2.1 brpc网络有啥降级? 3、移动语义4、python协程 二、1. mq怎么保障数据的顺序?3.brpc中上下游通信,怎么测评新增字段大小,对耗时的影响? 1 1、brpc和grpc区别,为啥选择brpc? gr…...
cocos 按钮
1、创建按钮 2、创建脚本 3、将脚本挂载到其他节点上 4、将节点和按钮绑定 即可实现点击按钮触发脚本。 在触发的脚本函数里面设置按钮节点的位置,将其移除屏幕,可以实现点击消失按钮的效果。...
文件扫描工具都有哪些?职场大佬都在用的文本提取工具大盘点~
回想起刚毕业初入职场那阵子,领导让帮忙把纸质文件扫描提取为文本时,还只会傻乎乎地一点点操作,属实是费劲得很! 好在后面受朋友安利,找到了4个能够快速实现文件扫描文字提取的方法,这才让我的办公效率蹭蹭…...
【学习】程序员资源网站
1 书栈网 简介:书栈网是程序员互联网IT开源编程书籍、资源免费阅读的网站,在书栈网你可以找到很多书籍、笔记资源。在这里,你可以根据热门收藏和阅读查看大家都在看什么,也可以根据技术栈分类找到对应模块的编程资源,…...
游戏缓存与异步持久化的完美邂逅
1、问题提出 游戏服务器,需要频繁的读取玩家数据,同时也需求频发修改玩家数据,并持久化到数据库。为了提高游戏服务器的性能,我们应该怎么处理呢? 2、针对读——使用缓存 缓存,是指应用程序从数据库读取完数据之后,就将数据缓存在进程内存或第三方内存(例如redis)。…...
MySQL 高级 - 第十二章 | 数据库的设计规范
目录 第十二章 数据库的设计规范12.1 为什么需要数据库设计12.2 范式12.2.1 范式简介12.2.2 范式都包括哪些12.2.3 键和相关属性的概念12.2.4 第一范式(1st NF)12.2.5 第二范式(2nd NF)12.2.6 第三范式(3rd NF…...
【Python】AJAX
AJAX基础 一、AJAX1.1 概述1.2 XMLHttpRequest对象1.3 AJAX请求六部曲1.4 图解AJAX请求步骤 二、jQuery与AJAX2.1 jQuery.get()2.2 jQuery.getJSON()2.3 jQuery.post()2.4 jQuery.ajax() 三、Django使用AJAX3.1 请求类型3.2 PUT与PATCH的区别3.3 接收及响应JSON3.3.1 接收JSON3…...
scikit-image安装报错
scikit-image安装报错: pip install scikit-image0.21.0 报错信息: Collecting PyWavelets>1.1.1 (from scikit-image0.21.0) Installing build dependencies … error error: subprocess-exited-with-error 解决方法: 提前安装好PyWave…...
STM32(七)———TIM定时器(基本and通用)
文章目录 前言一、通用定时器TIM简介1.STM32F10X系列总共最多有八个定时器:2.三种STM32定时器的区别:3.STM32 的通用定时器功能:4.计数器模式 二、基本定时器1.基本定时器的结构框图2.定时时间的计算3.定时器的结构体和库函数 总结 前言 一个…...
Spring中网络请求客户端WebClient的使用详解
Spring中网络请求客户端WebClient的使用详解_java_脚本之家 Spring5的WebClient使用详解-腾讯云开发者社区-腾讯云 在 Spring 5 之前,如果我们想要调用其他系统提供的 HTTP 服务,通常可以使用 Spring 提供的 RestTemplate 来访问,不过由于 …...
那些年我为了考PMP踩过的坑.....
说到考PMP我尊嘟很难过且伤心,众所周知,报考PMP都是要报机构的而且还是PMI认证的机构,所以在报考PMP过程中选的机构我可以说踩过了很多坑了...... Q:包过吗? 大家千万不要信某某机构说的包过噱头,真的很坑…...
邦芒解析:新人入职后存在的三种职场心理误区
多数职场新人会认为自己工作不快乐,不能正确处理职场人际关系。尤其是新人入职后在处理人际关系方面更明显,下面简述新人入职后主要存在的三种职场心理误区。 误区一:面对对上司的恐惧 学会和上司沟通,新人要采用上司容易接受…...
MFC案例:利用SetTimer函数编写一个“计时器”程序
一、希望达成效果 利用基于对话框的MFC项目,做一个一方面能够显示当前时间;另一方面在点击开始按钮时进行读秒计时,计时结果动态显示,当点击结束时读秒结束并保持最后结果。 二、编程步骤及相关代码、注释 1、启动VS…...
2. 音视频H264
视频软件基本流程 1.什么是H264 H.264是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器标准 H265又名高…...
烽宇团队回报社会,走进贵州山区公益行
贵州省——在一片美丽的黔山秀水间,烽宇团队成员用实际行动诠释了“取之于民,用之于民”的公益精神。作为在科技和商业领域取得显著成就的团队,烽宇团队不仅在商业上取得了辉煌的成绩,还积极投身于社会公益事业,回报社会。 取之于民,用之于民 近年来,烽宇团队在多位行业领袖的…...
硬盘格式化NTFS好还是exFAT好 U盘存储文件用哪个格式好? 硬盘用exfat还是ntfs mac不能读取移动硬盘怎么解决
在计算机世界中,文件系统是数据管理的基石,而NTFS和exFAT无疑是这块基石上的两大巨头。它们各自拥有独特的特点和优势,并在不同的使用场景中发挥着重要作用。 什么是文件系统 文件系统提供了组织驱动器的方法。它规定了如何在驱动器上存储数…...
Elasticsearch机器学习初探:智能数据洞察
在当今数据驱动的时代,企业越来越依赖于数据来做出明智的决策。然而,随着数据量的不断增长和复杂性的增加,传统的数据分析方法已经无法满足快速、准确洞察数据的需求。为了应对这一挑战,Elasticsearch引入了机器学习功能ÿ…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...
