找回密码
 立即注册
首页 业界区 业界 【源码解读之 Mybatis】【基础篇】-- 第3篇:SqlSession ...

【源码解读之 Mybatis】【基础篇】-- 第3篇:SqlSession的创建与生命周期

盒礁泅 2025-9-25 07:15:52
第3篇:SqlSession的创建与生命周期

1. 学习目标确认

1.0 第2篇思考题解答

在深入学习SqlSession之前,让我们先回顾并解答第2篇中提出的思考题,这将帮助我们更好地理解SqlSession在整个架构中的作用。
思考题1:为什么MyBatis要设计如此复杂的配置系统?

答案要点

  • 统一管理:所有配置项集中管理,避免配置分散和重复
  • 灵活性:支持XML、注解、代码三种配置方式,满足不同场景需求
  • 可扩展性:通过插件系统和自定义配置支持功能扩展
  • 性能优化:配置缓存、懒加载等机制提升性能
  • 类型安全:强类型配置减少运行时错误
SqlSession的作用:SqlSession作为配置系统的使用者,通过Configuration获取所有必要的配置信息。
思考题2:配置系统的扩展性体现在哪些方面?

答案要点

  • 插件扩展:Interceptor接口支持功能扩展
  • 类型处理器扩展:TypeHandler接口支持自定义类型转换
  • 对象工厂扩展:ObjectFactory接口支持自定义对象创建
  • 数据源扩展:DataSource接口支持自定义数据源
  • 事务管理扩展:TransactionFactory接口支持自定义事务管理
SqlSession的扩展性:SqlSession通过Executor、StatementHandler等组件实现功能扩展。
思考题3:如何优化配置解析的性能?

答案要点

  • 缓存机制:解析后的配置对象缓存,避免重复解析
  • 懒加载:非必需配置延迟加载,减少启动时间
  • 批量处理:相关配置项批量解析,提高效率
  • 内存优化:优化配置对象的内存使用,减少GC压力
SqlSession的性能:SqlSession通过Executor缓存、连接池等技术优化性能。
思考题4:基于配置系统的理解,应该从哪个组件开始深入源码分析?

推荐顺序:SqlSession → Executor → StatementHandler → ParameterHandler + ResultSetHandler
从SqlSession开始的原因

  • SqlSession是配置系统的直接使用者
  • 理解SqlSession有助于理解整个执行流程
  • 为后续学习Executor等组件奠定基础
1.1 SqlSession概述(基于MyBatis 3.5.x)

SqlSession是MyBatis的核心接口,代表与数据库的一次会话。它是MyBatis架构中接口层的重要组成部分,为用户提供了简洁的API来执行数据库操作。
SqlSession的核心职责

  • 数据库操作:提供CRUD操作的统一接口
  • 事务管理:管理数据库事务的提交和回滚
  • Mapper管理:获取Mapper接口的动态代理对象
  • 会话管理:管理会话的生命周期和资源释放
重要提示:理解SqlSession的设计和实现是深入MyBatis源码的关键,后续的Executor、StatementHandler等组件都围绕SqlSession展开。
2. SqlSession接口设计分析

2.1 SqlSession接口结构

让我们深入分析SqlSession接口的设计:
  1. package org.apache.ibatis.session;
  2. import java.io.Closeable;
  3. import java.sql.Connection;
  4. import java.util.List;
  5. import java.util.Map;
  6. import org.apache.ibatis.cursor.Cursor;
  7. import org.apache.ibatis.executor.BatchResult;
  8. import org.apache.ibatis.executor.result.ResultHandler;
  9. public interface SqlSession extends Closeable {
  10.     // 查询操作
  11.     <T> T selectOne(String statement);
  12.     <T> T selectOne(String statement, Object parameter);
  13.     <E> List<E> selectList(String statement);
  14.     <E> List<E> selectList(String statement, Object parameter);
  15.     <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds);
  16.   
  17.     // Map查询操作
  18.     <K, V> Map<K, V> selectMap(String statement, String mapKey);
  19.     <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey);
  20.     <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds);
  21.   
  22.     // 游标查询
  23.     <T> Cursor<T> selectCursor(String statement);
  24.     <T> Cursor<T> selectCursor(String statement, Object parameter);
  25.     <T> Cursor<T> selectCursor(String statement, Object parameter, RowBounds rowBounds);
  26.   
  27.     // 自定义结果处理(流式结果)
  28.     void select(String statement, Object parameter, ResultHandler handler);
  29.     void select(String statement, ResultHandler handler);
  30.     void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler);
  31.   
  32.     // 更新操作
  33.     int insert(String statement);
  34.     int insert(String statement, Object parameter);
  35.     int update(String statement);
  36.     int update(String statement, Object parameter);
  37.     int delete(String statement);
  38.     int delete(String statement, Object parameter);
  39.   
  40.     // 事务管理
  41.     void commit();
  42.     void commit(boolean force);
  43.     void rollback();
  44.     void rollback(boolean force);
  45.   
  46.     // 批量操作
  47.     List<BatchResult> flushStatements();
  48.   
  49.     // Mapper获取
  50.     <T> T getMapper(Class<T> type);
  51.   
  52.     // 连接管理
  53.     Connection getConnection();
  54.   
  55.     // 配置获取
  56.     Configuration getConfiguration();
  57.   
  58.     // 缓存管理
  59.     void clearCache();
  60. }
复制代码
2.2 接口设计特点分析

2.2.1 泛型设计
  1. // 泛型设计提供了类型安全
  2. <T> T selectOne(String statement, Object parameter);
  3. <E> List<E> selectList(String statement, Object parameter);
复制代码
优势

  • 类型安全:编译时类型检查,避免运行时类型转换错误
  • 代码简洁:无需手动类型转换
  • IDE支持:更好的代码提示和重构支持
2.2.2 ResultHandler自定义结果处理
  1. // 支持自定义结果处理,适用于流式结果处理
  2. void select(String statement, Object parameter, ResultHandler handler);
  3. void select(String statement, ResultHandler handler);
  4. void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler);
复制代码
使用场景

  • 流式处理:处理大量数据时避免内存溢出
  • 自定义转换:对结果进行自定义处理
  • 实时处理:边查询边处理结果
示例用法
[code]// 流式处理大量数据session.select("selectAllUsers", null, new ResultHandler() {    @Override    public void handleResult(ResultContext

相关推荐

您需要登录后才可以回帖 登录 | 立即注册