【Mytais系列】SqlSession
MyBatis 的 SqlSession 是框架的核心接口之一,它是应用程序与 MyBatis 交互的顶层 API,用于执行 SQL 命令、管理事务和访问数据库。以下是关于 SqlSession 的详细说明:
1. 核心功能
(1) 执行 SQL 操作
- 增删改查:通过方法如 selectOne,selectList,insert,update,delete直接执行映射的 SQL 语句。
- 动态参数绑定:支持传递参数对象(如 POJO、Map、基本类型)到 SQL 中。
// 示例:查询用户
User user = sqlSession.selectOne("com.example.mapper.UserMapper.selectById", 1);// 示例:插入用户
int rows = sqlSession.insert("com.example.mapper.UserMapper.insert", newUser);(2) 事务管理
- 手动提交/回滚:通过 commit()和rollback()控制事务。
- 自动提交:可在创建 SqlSession时设置autoCommit=true(默认关闭)。
try {sqlSession.insert("insertUser", user);sqlSession.commit(); // 显式提交事务
} catch (Exception e) {sqlSession.rollback(); // 回滚事务
}(3) 获取 Mapper 接口
- 通过 getMapper(Class<T> type)获取 Mapper 接口的代理对象,以面向接口的方式操作 SQL。
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.selectById(1);(4) 管理本地缓存(一级缓存)
- 缓存范围:默认开启,缓存范围为 SqlSession级别(会话级缓存)。
- 缓存失效:执行更新操作(insert/update/delete)或调用clearCache()会清空缓存。
sqlSession.clearCache(); // 手动清理一级缓存2. 生命周期与线程安全
(1) 生命周期
- 创建:通过 SqlSessionFactory.openSession()创建。
- 使用:在单个请求或操作中执行 SQL。
- 关闭:必须显式调用 close()释放资源(或使用try-with-resources)。
// 正确用法:确保资源释放
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {User user = sqlSession.selectOne("selectUserById", 1);
} // 自动关闭(2) 线程安全
- 非线程安全:SqlSession实例不应在多线程间共享。每个线程应使用独立的SqlSession。
3. 创建方式
通过 SqlSessionFactory 创建 SqlSession,支持以下参数:
- autoCommit:是否自动提交事务(默认- false)。
- executorType:执行器类型(- SIMPLE,- REUSE,- BATCH)。
- connection:指定 JDBC 连接(适用于需要复用连接的场景)。
// 默认执行器(SIMPLE),手动提交事务
SqlSession sqlSession = sqlSessionFactory.openSession();// 自动提交事务
SqlSession autoCommitSession = sqlSessionFactory.openSession(true);// 使用批量执行器
SqlSession batchSession = sqlSessionFactory.openSession(ExecutorType.BATCH);4. 核心方法
| 方法 | 说明 | 
| 
 | 查询单条记录,参数为 SQL 标识和参数对象。 | 
| 
 | 查询多条记录,支持分页( | 
| 
 | 执行插入操作。 | 
| 
 | 执行更新操作。 | 
| 
 | 执行删除操作。 | 
| 
 | 提交事务(需显式调用,除非  | 
| 
 | 回滚事务。 | 
| 
 | 获取 Mapper 接口的动态代理对象。 | 
| 
 | 清空当前会话的一级缓存。 | 
| 
 | 获取底层 JDBC 连接(需谨慎使用)。 | 
5. 一级缓存机制
- 缓存范围:同一个 SqlSession内的多次相同查询会命中缓存。
- 缓存失效条件:
-  - 执行了 insert/update/delete。
- 调用了 clearCache()。
- 提交或回滚事务(部分配置下)。
 
- 执行了 
6. 与 SqlSessionFactory 的关系
- 工厂模式:SqlSessionFactory是生产SqlSession的工厂,通常全局唯一(应用生命周期内)。
- 资源开销:创建 SqlSession的代价较低,但需及时关闭以避免连接泄漏。
7. 最佳实践
- 使用 try-with-resources:确保 SqlSession正确关闭。
- 避免长会话:单个 SqlSession不应长时间存活,防止缓存膨胀。
- 优先使用 Mapper 接口:通过 getMapper()提高代码可读性和类型安全。
- 显式事务控制:在需要时手动提交事务,避免意外修改。
总结
SqlSession 是 MyBatis 的核心交互接口,负责 SQL 执行、事务管理和缓存控制。正确使用它的生命周期和事务机制,能有效提升数据库操作的安全性和性能。结合 Mapper 接口和 Spring 等框架的事务管理(如 @Transactional),可以进一步简化开发流程。
