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

深入理解 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 语句,包括 selectOneselectListinsertupdatedelete 等。
  • 获取映射器:通过 SqlSession 可以获取到 Mapper 接口的实例,从而调用 Mapper 中定义的 SQL 方法。
  • 管理事务SqlSession 提供了事务管理的方法,如 commitrollback 等。

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 提供了事务管理的方法,如 commitrollback 等。

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 应用的性能和稳定性。

在这里插入图片描述

http://www.lryc.cn/news/536173.html

相关文章:

  • ndk 编译opencv(去除libandroid.so mediandk依赖)
  • MySQL索引和其底层数据结构介绍
  • No module named ‘posepile.util‘
  • SQL布尔盲注、时间盲注
  • RocketMQ与kafka如何解决消息丢失问题?
  • Uniapp 获取定位详解:从申请Key到实现定位功能
  • 【Vue3 入门到实战】14. telePort 和 Suspense组件
  • Golang的并发编程案例详解
  • IS-IS 泛洪机制 | LSP 处理流程
  • 原型模式详解(Java)
  • 内存条2R×4 2400和4R×4 2133的性能差异
  • 安装并配置 MySQL
  • 常用的网络安全设备
  • 【蓝桥】线性DP--最快洗车时间
  • Spring Boot比Spring多哪些注解?
  • springboot021校园周边美食探索及分享平台
  • 【网络通信】传输层之UDP协议
  • Python环境搭建与量化交易开发:从基础到实战
  • 软著申请(六)软著返修流程【2025年最新版】
  • SOUI基于Zint生成Code11码
  • sqlilabs第八关
  • 基于HAL库的按钮实验
  • DeepSeek 突然来袭,AI 大模型变革的危机与转机藏在哪?
  • prompt技术结合大模型 生成测试用例
  • 【C++ 真题】P2920 [USACO08NOV] Time Management S
  • pip安装指定版本的包
  • 【pytest】获取所有用例名称并存于数据库
  • Java中原子操作的实现原理
  • 25农村发展研究生复试面试问题汇总 农村发展专业知识问题很全! 农村发展复试全流程攻略 农村发展考研复试真题汇总
  • 一维前缀和与二维前缀和