第3篇:SqlSession的创建与生命周期
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.xSqlSession是MyBatis的核心接口代表与数据库的一次会话。它是MyBatis架构中接口层的重要组成部分为用户提供了简洁的API来执行数据库操作。SqlSession的核心职责数据库操作提供CRUD操作的统一接口事务管理管理数据库事务的提交和回滚Mapper管理获取Mapper接口的动态代理对象会话管理管理会话的生命周期和资源释放重要提示理解SqlSession的设计和实现是深入MyBatis源码的关键后续的Executor、StatementHandler等组件都围绕SqlSession展开。2. SqlSession接口设计分析2.1 SqlSession接口结构让我们深入分析SqlSession接口的设计package org.apache.ibatis.session; import java.io.Closeable; import java.sql.Connection; import java.util.List; import java.util.Map; import org.apache.ibatis.cursor.Cursor; import org.apache.ibatis.executor.BatchResult; import org.apache.ibatis.executor.result.ResultHandler; public interface SqlSession extends Closeable { // 查询操作 T T selectOne(String statement); T T selectOne(String statement, Object parameter); E ListE selectList(String statement); E ListE selectList(String statement, Object parameter); E ListE selectList(String statement, Object parameter, RowBounds rowBounds); // Map查询操作 K, V MapK, V selectMap(String statement, String mapKey); K, V MapK, V selectMap(String statement, Object parameter, String mapKey); K, V MapK, V selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds); // 游标查询 T CursorT selectCursor(String statement); T CursorT selectCursor(String statement, Object parameter); T CursorT selectCursor(String statement, Object parameter, RowBounds rowBounds); // 自定义结果处理流式结果 void select(String statement, Object parameter, ResultHandler handler); void select(String statement, ResultHandler handler); void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler); // 更新操作 int insert(String statement); int insert(String statement, Object parameter); int update(String statement); int update(String statement, Object parameter); int delete(String statement); int delete(String statement, Object parameter); // 事务管理 void commit(); void commit(boolean force); void rollback(); void rollback(boolean force); // 批量操作 ListBatchResult flushStatements(); // Mapper获取 T T getMapper(ClassT type); // 连接管理 Connection getConnection(); // 配置获取 Configuration getConfiguration(); // 缓存管理 void clearCache(); }2.2 接口设计特点分析2.2.1 泛型设计// 泛型设计提供了类型安全 T T selectOne(String statement, Object parameter); E ListE selectList(String statement, Object parameter);优势类型安全编译时类型检查避免运行时类型转换错误代码简洁无需手动类型转换IDE支持更好的代码提示和重构支持2.2.2 ResultHandler自定义结果处理// 支持自定义结果处理适用于流式结果处理 void select(String statement, Object parameter, ResultHandler handler); void select(String statement, ResultHandler handler); void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler);使用场景流式处理处理大量数据时避免内存溢出自定义转换对结果进行自定义处理实时处理边查询边处理结果