核心内容摘要
当寂静的闪光被揭开:流萤自我奖励被发现的深层解析
SqlSession初始化与获取SqlSession是MyBatis的核心对象用于执行SQL操作。
SqlSessionFactory是创建SqlSession的工厂类通过build()方法初始化并通过openSession()方法获取SqlSession。
SqlSessionFactoryBuilder是构建SqlSessionFactory的工具类负责解析配置文件并创建SqlSessionFactory。
示例代码java复制// 构建 SqlSessionFactory public SqlSessionFactory build(InputStream inputStream) { Configuration configuration new Configuration(); // 创建配置对象 XMLConfigBuilder xmlConfigBuilder new XMLConfigBuilder(inputStream); // 解析配置文件 configuration xmlConfigBuilder.parse(); // 解析 XML 配置 return new DefaultSqlSessionFactory(configuration); // 创建 SqlSessionFactory }
SqlSession中的select方法SqlSession提供了selectOne()和selectList()等方法用于执行查询操作。
这些方法最终调用select()方法通过Executor执行SQL查询。
示例代码java复制public E ListE selectList(String statement, Object parameter) { Executor executor this.configuration.newExecutor(this, ExecutorType.SIMPLE); // 创建 Executor return executor.query(statement, parameter); // 执行查询 }
Executor接口与query()方法Executor是MyBatis的核心执行器负责执行SQL操作。
常见的Executor实现包括SimpleExecutor每次执行SQL时都会创建新的PreparedStatement。
ReuseExecutor重用PreparedStatement。
BatchExecutor批量执行SQL。
query()方法通过StatementHandler和ResultSetHandler处理SQL的准备、执行和结果映射。
示例代码java复制public ListObject query(String statement, Object parameter) throws SQLException { StatementHandler handler configuration.newStatementHandler(); // 创建 StatementHandler Statement stmt handler.prepare(connection, transaction); // 准备 SQL ResultSetHandler resultSetHandler configuration.newResultSetHandler(); // 创建 ResultSetHandler return resultSetHandler.handleResultSets(stmt); // 处理结果集 }
StatementHandler的工作原理StatementHandler负责SQL的准备工作包括创建PreparedStatement。
设置SQL参数。
执行SQL语句。
prepare()方法用于预编译SQL语句并为查询设置参数。
ParameterHandler的作用ParameterHandler负责将Java对象中的参数绑定到SQL语句中。
setParameters()方法根据SQL语句中参数的顺序通过PreparedStatement将Java参数绑定到SQL中。
ResultSetHandler的工作原理ResultSetHandler负责处理SQL执行后的结果集将ResultSet中的数据映射到Java对象中。
它会将每一行数据从ResultSet中提取出来并根据MappedStatement的配置映射为目标对象。
MappedStatement的配置与SQL映射MappedStatement是MyBatis中用于封装SQL语句和映射信息的对象。
它包含了SQL语句。
查询参数类型。
结果类型。
MappedStatement由SqlSession传递给Executor执行。
事务管理与Transaction接口MyBatis使用Transaction接口管理事务负责开启、提交和回滚事务。
Transaction接口的实现由数据库连接控制MyBatis会根据配置使用不同的事务管理方式如JDBC事务、管理事务等。
自动生成SQL和参数绑定的流程MyBatis支持动态SQL语句的生成例如通过if、choose等标签生成不同的SQL语句。
在执行时SqlSession会根据MappedStatement的配置动态构建SQL。
ParameterHandler会在执行SQL时根据用户输入的参数生成最终的SQL语句。
总结MyBatis通过以下流程完成SQL的执行SqlSessionFactory初始化通过SqlSessionFactoryBuilder解析配置文件创建SqlSessionFactory。
SqlSession获取通过SqlSessionFactory的openSession()方法获取SqlSession。
SQL执行SqlSession调用Executor的query()方法。
Executor通过StatementHandler准备SQL通过ParameterHandler绑定参数通过ResultSetHandler处理结果集。
事务管理通过Transaction接口管理事务。
补充说明动态SQLMyBatis支持通过XML中的if、choose、when、otherwise等标签动态生成SQL语句。
这些标签允许根据条件动态拼接SQL提高灵活性。
缓存机制MyBatis提供了两级缓存一级缓存SqlSession级别的缓存同一个SqlSession中重复执行相同的查询语句时会直接从缓存中获取结果。
二级缓存Mapper级别的缓存多个SqlSession可以共享缓存数据。
插件机制MyBatis支持插件Interceptor可以通过插件机制拦截和修改Executor、StatementHandler、ResultSetHandler等组件的行为实现日志记录、性能监控等功能。