深入理解 MyBatis 框架的核心对象:SqlSession
Mybatis框架中的SqlSession对象详解
引言
MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
在学习 MyBatis 框架时,SqlSession是一个无法绕开的核心概念。它是 MyBatis 提供的一个面向用户的接口,封装了底层的数据库操作细节,使得开发者可以通过简单的接口调用完成复杂的数据库交互。本文将详细介绍 SqlSession 的功能、创建方式、生命周期以及与其他相关对象的关系,帮助大家更好地理解和使用 MyBatis。
1. SqlSession 概述
SqlSession 是 MyBatis 中用于执行 SQL 语句、获取映射器(Mapper)和管理事务的接口。它是 MyBatis 框架与数据库交互的核心对象。每个线程都应该有它自己的 SqlSession 实例,SqlSession 的实例不是线程安全的,因此不能被共享。
1.1 SqlSession 的主要功能
- 执行 SQL 语句:
SqlSession提供了多种方法来执行 SQL 语句,包括selectOne、selectList、insert、update、delete等。 - 获取映射器:通过
SqlSession可以获取到 Mapper 接口的实例,从而调用 Mapper 中定义的 SQL 方法。 - 管理事务:
SqlSession提供了事务管理的方法,如commit、rollback等。
2. SqlSession 的创建与关闭
2.1 创建 SqlSession
SqlSession 是通过 SqlSessionFactory 创建的。SqlSessionFactory 是一个线程安全的对象,它可以通过 SqlSessionFactoryBuilder 来构建。
// 指定 MyBatis 配置文件的路径
// 配置文件通常命名为 "mybatis-config.xml",位于项目的资源目录中
String resource = "mybatis-config.xml";// 使用 MyBatis 的 Resources 工具类加载配置文件
// Resources 是 MyBatis 提供的一个工具类,用于加载资源文件
// getResourceAsStream 方法会从类路径中加载指定的资源文件,并返回一个 InputStream 对象
InputStream inputStream = Resources.getResourceAsStream(resource);// 使用 SqlSessionFactoryBuilder 构建 SqlSessionFactory
// SqlSessionFactoryBuilder 是 MyBatis 提供的一个构建器类,用于创建 SqlSessionFactory
// build 方法接受一个 InputStream 对象,解析 MyBatis 的配置文件,并初始化 MyBatis 的运行环境
// 最终返回一个 SqlSessionFactory 对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 使用 SqlSessionFactory 创建 SqlSession
// SqlSession 是 MyBatis 的核心接口,用于执行 SQL 语句、获取 Mapper 接口的代理对象和管理事务
// openSession 方法默认创建一个自动提交(AUTO)的 SqlSession
// 如果需要手动提交事务,可以调用 openSession(false)
SqlSession sqlSession = sqlSessionFactory.openSession();
2.2 关闭 SqlSession
SqlSession 使用完毕后,应该及时关闭以释放数据库连接资源。
sqlSession.close();
3. SqlSession 的常用方法
3.1 执行 SQL 语句
SqlSession 提供了多种方法来执行 SQL 语句,常用的方法包括:
selectOne(String statement, Object parameter):执行查询并返回一个对象。selectList(String statement, Object parameter):执行查询并返回一个对象列表。insert(String statement, Object parameter):执行插入操作。update(String statement, Object parameter):执行更新操作。delete(String statement, Object parameter):执行删除操作。
// 查询单个用户
// selectOne 方法用于执行查询操作,返回单个结果
// 参数1:映射文件中定义的 SQL 语句的 ID,格式为 "namespace.SQL语句ID"
// 参数2:传递给 SQL 语句的参数,这里是用户ID
// 返回值:查询结果,类型为 User 对象
User user = sqlSession.selectOne("org.mybatis.example.UserMapper.selectUser", 1);// 查询所有用户
// selectList 方法用于执行查询操作,返回多个结果
// 参数1:映射文件中定义的 SQL 语句的 ID
// 返回值:查询结果,类型为 User 对象的列表
List<User> users = sqlSession.selectList("org.mybatis.example.UserMapper.selectAllUsers");// 插入新用户
// insert 方法用于执行插入操作
// 参数1:映射文件中定义的 SQL 语句的 ID
// 参数2:传递给 SQL 语句的参数,这里是 User 对象
// 返回值:插入操作影响的行数
sqlSession.insert("org.mybatis.example.UserMapper.insertUser", newUser);// 更新用户信息
// update 方法用于执行更新操作
// 参数1:映射文件中定义的 SQL 语句的 ID
// 参数2:传递给 SQL 语句的参数,这里是 User 对象
// 返回值:更新操作影响的行数
sqlSession.update("org.mybatis.example.UserMapper.updateUser", user);// 删除用户
// delete 方法用于执行删除操作
// 参数1:映射文件中定义的 SQL 语句的 ID
// 参数2:传递给 SQL 语句的参数,这里是用户ID
// 返回值:删除操作影响的行数
sqlSession.delete("org.mybatis.example.UserMapper.deleteUser", 1);
3.2 获取映射器
通过 SqlSession 可以获取到 Mapper 接口的实例,从而调用 Mapper 中定义的 SQL 方法。
// 通过 SqlSession 获取 UserMapper 接口的代理对象
// getMapper 方法会根据传入的 Mapper 接口类型,返回一个代理对象
// 这个代理对象内部封装了 SQL 语句的执行逻辑,通过调用代理对象的方法,
// 可以执行 Mapper 接口中定义的数据库操作
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 调用 UserMapper 接口的 selectUser 方法查询用户
User user = userMapper.selectUser(1);
3.3 事务管理
SqlSession 提供了事务管理的方法,如 commit、rollback 等。
try {sqlSession.insert("org.mybatis.example.UserMapper.insertUser", newUser);sqlSession.commit();
} catch (Exception e) {sqlSession.rollback();
} finally {sqlSession.close();
}
4. SqlSession 的最佳实践
4.1 使用 try-with-resources 语句
为了确保 SqlSession 能够正确关闭,可以使用 Java 7 引入的 try-with-resources 语句。
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = userMapper.selectUser(1);// 其他操作
}
4.2 使用自动提交模式
在某些情况下,可以将 SqlSession 设置为自动提交模式,这样每次执行 SQL 语句后都会自动提交事务。
SqlSession sqlSession = sqlSessionFactory.openSession(true);
4.3 使用局部变量
SqlSession 的实例不是线程安全的,因此应该将其作为局部变量使用,避免在多线程环境中共享。
public void doSomething() {try (SqlSession sqlSession = sqlSessionFactory.openSession()) {UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = userMapper.selectUser(1);// 其他操作}
}
5. 总结
SqlSession 是 MyBatis 框架中非常重要的对象,它负责执行 SQL 语句、获取映射器和管理事务。在使用 SqlSession 时,应该注意其线程安全性,并确保在使用完毕后及时关闭。通过合理使用 SqlSession,可以有效地提高 MyBatis 应用的性能和稳定性。

相关文章:
深入理解 MyBatis 框架的核心对象:SqlSession
Mybatis框架中的SqlSession对象详解 引言 MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息࿰…...
ndk 编译opencv(去除libandroid.so mediandk依赖)
简单的bash运行 需要关注的: OPENCV_EXTRA_MODULES_PATH : opencv contrib库BUILD_opencv_XXX :添加contrib库后默认是contrib库全部编译,用这个控制需要关闭的NDK的路径 export ANDROID_NDK/media/hello/data/3rd_party/25.2.…...
MySQL索引和其底层数据结构介绍
索引在项目中非常常见,它是一种帮助MySQL高效获取数据的数据结构,主要用来提高数据检索效率,降低数据库的I/O成本。同时,索引列可以对数据进行排序,降低数据排序的成本,也能减少CPU的消耗。就像是书的目录&…...
No module named ‘posepile.util‘
目录 No module named posepile.util 解决方法: No module named posepile.util 错误代码: import posepile.datasets3d as ds3d pip install git+https://github.com/isarandi/PosePile.git. And then, I executed the following command, " python -m metrabs_py…...
SQL布尔盲注、时间盲注
一、布尔盲注 布尔盲注(Boolean-based Blind SQL Injection)是一种SQL注入技术,用于在应用程序不直接显示数据库查询结果的情况下,通过构造特定的SQL查询并根据页面返回的不同结果来推测数据库中的信息。这种方法依赖于SQL查询的…...
RocketMQ与kafka如何解决消息丢失问题?
0 前言 消息丢失基本是分布式MQ中需要解决问题,消息丢失时保证数据可靠性的范畴。如何保证消息不丢失程序员面试中几乎不可避免的问题。本文主要说明RocketMQ和Kafka在解决消息丢失问题时,在生产者、Broker和消费者之间如何解决消息丢失问题。 1.Rocket…...
Uniapp 获取定位详解:从申请Key到实现定位功能
文章目录 前言一、申请定位所需的 Key1.1 注册高德开发者账号1.2 创建应用1.3 添加 Key 二、在 Uniapp 中配置定位功能2.1 引入高德地图 SDK2.2 获取定位权限 三、实现定位功能3.1 使用 uni.getLocation 获取位置3.2 处理定位失败的情况3.3 持续定位3.4 停止持续定位 四、总结 …...
【Vue3 入门到实战】14. telePort 和 Suspense组件
目录 编辑 1. telePort 2. 异步组件Suspense 3. 总结 1. telePort telePort 允许你将子组件渲染到 DOM 中的任何位置,而不仅仅是在其父组件的范围内。这对于模态框(modals)、提示框(tooltips)和其他需要脱…...
Golang的并发编程案例详解
Golang的并发编程案例详解 一、并发编程概述 并发编程是指程序中有多个独立的执行线索,并且这些线索在时间上是重叠的。在 Golang 中,并发是其核心特性之一,通过 goroutine 和 channel 来支持并发编程,使得程序可以更高效地利用计…...
IS-IS 泛洪机制 | LSP 处理流程
IS-IS 泛洪机制 作为一种链路状态路由协议,IS-IS 与 OSPF 类似,在学习和计算路由之前,区域中的路由器首先需交换链路状态信息,最终使所有路由器的链路状态数据库达到一致状态,这就如同每台路由器都拥有一张相同的网络…...
原型模式详解(Java)
原型模式(Prototype Pattern),作为一种极具代表性的创建型设计模式,其核心思想在于通过复制,亦即克隆现有的对象,来达成创建新对象的目的,而非依赖传统的构造函数途径。这一模式巧妙地基于现有对…...
内存条2R×4 2400和4R×4 2133的性能差异
内存条2R4 2400和4R4 2133的性能差异 2R4 2400 和 4R4 2133 是两种不同的内存条规格,主要在Rank数量和频率上有所不同,具体性能差异如下: 1. Rank数量 2R4:表示内存条有2个Rank,每个Rank有4个内存芯片。4R4ÿ…...
安装并配置 MySQL
MySQL 是世界上最流行的开源关系型数据库管理系统之一,因其高性能、可靠性和易用性而被广泛应用于各种规模的企业级应用中。本文将详细介绍如何在不同的操作系统上安装和配置 MySQL,帮助你快速搭建起一个功能完善的数据库环境。 选择适合你的安装方式 …...
常用的网络安全设备
一、 WAF 应用防火墙 范围:应用层防护软件 作用: 通过特征提取和分块检索技术进行模式匹配来达到过滤,分析,校验网络请求包的目的,在保证正常网络应用功能的同时,隔绝或者阻断无效或者非法的攻击请求 可…...
【蓝桥】线性DP--最快洗车时间
题目描述 解题思路 完整代码 举例 总结 基于 0/1 背包思想 解决 洗车时间分配问题,本质上是子集和问题【给定一个 正整数数组 nums 和一个目标值 target,判断是否可以从 nums 选择 若干个数(每个数最多选一次),使…...
Spring Boot比Spring多哪些注解?
Spring Boot 相比 Spring 多了很多自动化配置和简化开发的注解,主要包括以下几类: Spring Boot 启动与自动配置相关Spring Boot 配置相关Spring Boot Web 相关Spring Boot 测试相关Spring Boot 条件装配相关Spring Boot 监控与 Actuator 相关 1. Spring…...
springboot021校园周边美食探索及分享平台
版权声明 所有作品均为本人原创,提供参考学习使用,如需要源码数据库配套文档请移步 www.taobysj.com 搜索获取 技术实现 开发语言:Javavue。 框架:后端spingboot前端vue。 模式:B/S。 数据库:mysql。 开…...
【网络通信】传输层之UDP协议
【网络通信】传输层之UDP协议 传输层端对端通信实现端到端通信的关键技术 UDP协议再谈端口号端口号划分关于端口号的两个问题 UDP协议基本格式UDP通信的特点UDP的缓冲区UDP数据报的最大长度基于UDP的应用层协议如何封装UDP报文以及如何交付UDP报文进一步理解封装和解包 传输层 …...
Python环境搭建与量化交易开发:从基础到实战
Python环境搭建与量化交易开发:从基础到实战 在量化交易领域,Python因其强大的数据处理能力和丰富的库支持而成为首选编程语言。本文将指导您如何在本地搭建一个适合量化交易的Python环境,并介绍一些实用的工具和技巧。 《QMT开通规则分享》…...
软著申请(六)软著返修流程【2025年最新版】
软著申请(六)软著返修流程【2025年最新版】 一、软著返修流程1、软著返修流程须知2、相关细节二、针对大模型特殊补正条件三、备注本服务提供详细的软件著作权申请流程指导。申请人严格按照指导步骤完成申请,若最终未能成功获得著作权登记,可联系服务提供方进行免费咨询和指…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
