当前位置: 首页 > news >正文

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

前言&#xff1a; 前文我们从源码层面梳理了 SqlSessionFactory 的创建过程&#xff0c;本篇我们继续分析一下 SqlSession 的获取过程。 初识 MyBatis 【MyBatis 核心概念】 案例代码&#xff1a; public class MyBatisTest {Testpublic void test() throws IOException {/…...

Upload-Labs:Pass - 1(JS前端白名单)

Pass_1 1. 上传测试2. 代码审计**获取文件输入的值**&#xff1a;**检查是否选择了文件**&#xff1a;**定义允许的文件类型**&#xff1a;**提取文件的扩展名**&#xff1a;**检查文件类型是否允许上传**&#xff1a;**构建错误消息并提醒用户**&#xff1a; 3.绕过思路3.1 将…...

vue大作业-实现学校官网

vue大作业-实现学校官网 基于vue2实现的学校官网 项目展示 学校官网介绍 欢迎访问我们学校的官方网站&#xff0c;这里为您提供了全面的信息和资源&#xff0c;帮助您更好地了解我们的教育理念、教学资源和学术活动。 首页 首页是您了解我们学校的起点。这里展示了学校的最…...

24面试记录002

文章目录 12、brpc的优化2.1 brpc网络有啥降级&#xff1f; 3、移动语义4、python协程 二、1. mq怎么保障数据的顺序&#xff1f;3.brpc中上下游通信&#xff0c;怎么测评新增字段大小&#xff0c;对耗时的影响&#xff1f; 1 1、brpc和grpc区别&#xff0c;为啥选择brpc? gr…...

cocos 按钮

1、创建按钮 2、创建脚本 3、将脚本挂载到其他节点上 4、将节点和按钮绑定 即可实现点击按钮触发脚本。 在触发的脚本函数里面设置按钮节点的位置&#xff0c;将其移除屏幕&#xff0c;可以实现点击消失按钮的效果。...

文件扫描工具都有哪些?职场大佬都在用的文本提取工具大盘点~

回想起刚毕业初入职场那阵子&#xff0c;领导让帮忙把纸质文件扫描提取为文本时&#xff0c;还只会傻乎乎地一点点操作&#xff0c;属实是费劲得很&#xff01; 好在后面受朋友安利&#xff0c;找到了4个能够快速实现文件扫描文字提取的方法&#xff0c;这才让我的办公效率蹭蹭…...

【学习】程序员资源网站

1 书栈网 简介&#xff1a;书栈网是程序员互联网IT开源编程书籍、资源免费阅读的网站&#xff0c;在书栈网你可以找到很多书籍、笔记资源。在这里&#xff0c;你可以根据热门收藏和阅读查看大家都在看什么&#xff0c;也可以根据技术栈分类找到对应模块的编程资源&#xff0c;…...

游戏缓存与异步持久化的完美邂逅

1、问题提出 游戏服务器,需要频繁的读取玩家数据,同时也需求频发修改玩家数据,并持久化到数据库。为了提高游戏服务器的性能,我们应该怎么处理呢? 2、针对读——使用缓存 缓存,是指应用程序从数据库读取完数据之后,就将数据缓存在进程内存或第三方内存(例如redis)。…...

MySQL 高级 - 第十二章 | 数据库的设计规范

目录 第十二章 数据库的设计规范12.1 为什么需要数据库设计12.2 范式12.2.1 范式简介12.2.2 范式都包括哪些12.2.3 键和相关属性的概念12.2.4 第一范式&#xff08;1st NF&#xff09;12.2.5 第二范式&#xff08;2nd NF&#xff09;12.2.6 第三范式&#xff08;3rd NF&#xf…...

【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安装报错&#xff1a; pip install scikit-image0.21.0 报错信息&#xff1a; Collecting PyWavelets>1.1.1 (from scikit-image0.21.0) Installing build dependencies … error error: subprocess-exited-with-error 解决方法&#xff1a; 提前安装好PyWave…...

STM32(七)———TIM定时器(基本and通用)

文章目录 前言一、通用定时器TIM简介1.STM32F10X系列总共最多有八个定时器&#xff1a;2.三种STM32定时器的区别&#xff1a;3.STM32 的通用定时器功能&#xff1a;4.计数器模式 二、基本定时器1.基本定时器的结构框图2.定时时间的计算3.定时器的结构体和库函数 总结 前言 一个…...

Spring中网络请求客户端WebClient的使用详解

Spring中网络请求客户端WebClient的使用详解_java_脚本之家 Spring5的WebClient使用详解-腾讯云开发者社区-腾讯云 在 Spring 5 之前&#xff0c;如果我们想要调用其他系统提供的 HTTP 服务&#xff0c;通常可以使用 Spring 提供的 RestTemplate 来访问&#xff0c;不过由于 …...

那些年我为了考PMP踩过的坑.....

说到考PMP我尊嘟很难过且伤心&#xff0c;众所周知&#xff0c;报考PMP都是要报机构的而且还是PMI认证的机构&#xff0c;所以在报考PMP过程中选的机构我可以说踩过了很多坑了...... Q&#xff1a;包过吗&#xff1f; 大家千万不要信某某机构说的包过噱头&#xff0c;真的很坑…...

邦芒解析:新人入职后存在的三种职场心理误区

​​多数职场新人会认为自己工作不快乐&#xff0c;不能正确处理职场人际关系。尤其是新人入职后在处理人际关系方面更明显&#xff0c;下面简述新人入职后主要存在的三种职场心理误区。 误区一&#xff1a;面对对上司的恐惧 学会和上司沟通&#xff0c;新人要采用上司容易接受…...

MFC案例:利用SetTimer函数编写一个“计时器”程序

一、希望达成效果 利用基于对话框的MFC项目&#xff0c;做一个一方面能够显示当前时间&#xff1b;另一方面在点击开始按钮时进行读秒计时&#xff0c;计时结果动态显示&#xff0c;当点击结束时读秒结束并保持最后结果。 二、编程步骤及相关代码、注释 1、启动VS…...

2. 音视频H264

视频软件基本流程 1.什么是H264 H.264是由ITU-T视频编码专家组&#xff08;VCEG&#xff09;和ISO/IEC动态图像专家组&#xff08;MPEG&#xff09;联合组成的联合视频组&#xff08;JVT&#xff0c;Joint Video Team&#xff09;提出的高度压缩数字视频编解码器标准 H265又名高…...

烽宇团队回报社会,走进贵州山区公益行

贵州省——在一片美丽的黔山秀水间,烽宇团队成员用实际行动诠释了“取之于民,用之于民”的公益精神。作为在科技和商业领域取得显著成就的团队,烽宇团队不仅在商业上取得了辉煌的成绩,还积极投身于社会公益事业,回报社会。 取之于民,用之于民 近年来,烽宇团队在多位行业领袖的…...

硬盘格式化NTFS好还是exFAT好 U盘存储文件用哪个格式好? 硬盘用exfat还是ntfs mac不能读取移动硬盘怎么解决

在计算机世界中&#xff0c;文件系统是数据管理的基石&#xff0c;而NTFS和exFAT无疑是这块基石上的两大巨头。它们各自拥有独特的特点和优势&#xff0c;并在不同的使用场景中发挥着重要作用。 什么是文件系统 文件系统提供了组织驱动器的方法。它规定了如何在驱动器上存储数…...

Elasticsearch机器学习初探:智能数据洞察

在当今数据驱动的时代&#xff0c;企业越来越依赖于数据来做出明智的决策。然而&#xff0c;随着数据量的不断增长和复杂性的增加&#xff0c;传统的数据分析方法已经无法满足快速、准确洞察数据的需求。为了应对这一挑战&#xff0c;Elasticsearch引入了机器学习功能&#xff…...

BiliTools跨平台哔哩哔哩工具箱:一站式B站资源管理终极解决方案

BiliTools跨平台哔哩哔哩工具箱&#xff1a;一站式B站资源管理终极解决方案 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持视频、音乐、番剧、课程下载……持续更新 项目地址: https://gitcode.com/GitHub_Trending/b…...

AtlasOS系统性能优化指南:从诊断到维护的全流程解决方案

AtlasOS系统性能优化指南&#xff1a;从诊断到维护的全流程解决方案 【免费下载链接】Atlas &#x1f680; An open and lightweight modification to Windows, designed to optimize performance, privacy and security. 项目地址: https://gitcode.com/GitHub_Trending/atl…...

二极管限幅与钳位电路设计原理与应用

基于二极管的限幅与钳位电路设计精解1. 二极管基础特性与工程应用1.1 单向导电特性分析二极管作为半导体器件的基础元件&#xff0c;其核心特性是单向导电性。当正向偏置电压超过导通阈值&#xff08;硅管约0.7V&#xff09;时呈现低阻态&#xff0c;反向偏置时则保持高阻态。这…...

从FCN到U-Net:盘点深度学习图像分割中,那些‘放大’特征图的秘密武器与选型指南

从FCN到U-Net&#xff1a;解码图像分割中的特征图放大技术选型 在构建图像分割模型时&#xff0c;特征图的上采样操作往往是决定最终分割精度的关键环节之一。不同于分类任务只需输出一个类别标签&#xff0c;分割网络需要对每个像素进行分类&#xff0c;这就要求网络能够将低分…...

3分钟掌握Balena Etcher:安全可靠的跨平台镜像烧录工具

3分钟掌握Balena Etcher&#xff1a;安全可靠的跨平台镜像烧录工具 【免费下载链接】etcher Flash OS images to SD cards & USB drives, safely and easily. 项目地址: https://gitcode.com/GitHub_Trending/et/etcher Balena Etcher是一款专为简化操作系统镜像部署…...

优化问题求解器选型指南:何时该用高斯伪谱法,而不是直接法或打靶法?

优化问题求解器选型指南&#xff1a;高斯伪谱法在动态系统控制中的战略定位 当面对化工反应器温度控制或航天器轨道转移这类复杂动态系统优化问题时&#xff0c;工程师们常陷入算法选择的困境。就像外科医生需要根据病灶位置选择手术刀或激光治疗一样&#xff0c;最优控制问题的…...

课堂教学质量综合评分系统

目录 一、项目环境与目录结构 1. 环境要求 2. 推荐目录结构 二、核心类设计&#xff1a;ClassroomScorer 三、关键代码深度解析 1. 基础路径配置 2. 初始化方法&#xff1a;极致灵活的配置 3. 上下文管理器&#xff1a;统一封装 CSV 读取 4. 数据加载&#xff1a;4 类 …...

MATLAB 数值计算辅助:分析 Stable Yogi 生成图像的色彩与纹理特征

MATLAB 数值计算辅助&#xff1a;分析 Stable Yogi 生成图像的色彩与纹理特征 1. 引言 最近在尝试用 Stable Yogi 生成一些皮革纹理的设计图&#xff0c;效果确实挺惊艳的。但生成得多了&#xff0c;就遇到一个新问题&#xff1a;我手头攒了几百张图&#xff0c;风格各异&…...

别再手动敲代码了!用Tesseract-OCR在Linux上批量处理图片转文字(附Python脚本)

从图片到结构化数据&#xff1a;基于Tesseract-OCR的Linux批量文本提取实战 在数字化办公和自动化流程中&#xff0c;我们经常需要处理大量图片中的文字信息——可能是扫描的合同文档、会议白板照片或是PDF中的非可编辑页面。传统的手动录入不仅效率低下&#xff0c;还容易出错…...

手把手教你用modf()和fmod()解决C语言浮点数计算中的常见坑

深入解析C语言浮点数计算&#xff1a;modf()与fmod()的实战应用 浮点数计算在C语言开发中无处不在&#xff0c;从游戏物理引擎到嵌入式传感器数据处理&#xff0c;精确的浮点运算直接关系到程序行为的正确性。然而&#xff0c;许多开发者第一次遭遇浮点数计算误差时&#xff0c…...