深入理解 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、相关细节二、针对大模型特殊补正条件三、备注本服务提供详细的软件著作权申请流程指导。申请人严格按照指导步骤完成申请,若最终未能成功获得著作权登记,可联系服务提供方进行免费咨询和指…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
