news 2026/5/4 16:24:44

MyBatis执行流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MyBatis执行流程

1.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 }

2.SqlSession中的select方法

  • SqlSession提供了selectOne()selectList()等方法,用于执行查询操作。
  • 这些方法最终调用select()方法,通过Executor执行SQL查询。
示例代码:

java复制

public <E> List<E> selectList(String statement, Object parameter) { Executor executor = this.configuration.newExecutor(this, ExecutorType.SIMPLE); // 创建 Executor return executor.query(statement, parameter); // 执行查询 }

3.Executor接口与query()方法

  • Executor是MyBatis的核心执行器,负责执行SQL操作。
  • 常见的Executor实现包括:
    • SimpleExecutor:每次执行SQL时都会创建新的PreparedStatement。
    • ReuseExecutor:重用PreparedStatement。
    • BatchExecutor:批量执行SQL。
  • query()方法通过StatementHandlerResultSetHandler处理SQL的准备、执行和结果映射。
示例代码:

java复制

public List<Object> 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); // 处理结果集 }

4.StatementHandler的工作原理

  • StatementHandler负责SQL的准备工作,包括:
    • 创建PreparedStatement
    • 设置SQL参数。
    • 执行SQL语句。
  • prepare()方法用于预编译SQL语句,并为查询设置参数。

5.ParameterHandler的作用

  • ParameterHandler负责将Java对象中的参数绑定到SQL语句中。
  • setParameters()方法根据SQL语句中参数的顺序,通过PreparedStatement将Java参数绑定到SQL中。

6.ResultSetHandler的工作原理

  • ResultSetHandler负责处理SQL执行后的结果,集将ResultSet中的数据映射到Java对象中。
  • 它会将每一行数据从ResultSet中提取出来,并根据MappedStatement的配置映射为目标对象。

7.MappedStatement的配置与SQL映射

  • MappedStatement是MyBatis中用于封装SQL语句和映射信息的对象。
  • 它包含了:
    • SQL语句。
    • 查询参数类型。
    • 结果类型。
  • MappedStatementSqlSession传递给Executor执行。

8.事务管理与Transaction接口

  • MyBatis使用Transaction接口管理事务,负责开启、提交和回滚事务。
  • Transaction接口的实现由数据库连接控制,MyBatis会根据配置使用不同的事务管理方式(如JDBC事务、管理事务等)。

9.自动生成SQL和参数绑定的流程

  • MyBatis支持动态SQL语句的生成,例如通过<if><choose>等标签生成不同的SQL语句。
  • 在执行时,SqlSession会根据MappedStatement的配置动态构建SQL。
  • ParameterHandler会在执行SQL时,根据用户输入的参数生成最终的SQL语句。

总结

MyBatis通过以下流程完成SQL的执行:

  1. SqlSessionFactory初始化:通过SqlSessionFactoryBuilder解析配置文件,创建SqlSessionFactory
  2. SqlSession获取:通过SqlSessionFactoryopenSession()方法获取SqlSession
  3. SQL执行
    • SqlSession调用Executorquery()方法。
    • Executor通过StatementHandler准备SQL,通过ParameterHandler绑定参数,通过ResultSetHandler处理结果集。
  1. 事务管理:通过Transaction接口管理事务。

补充说明

  1. 动态SQL
    • MyBatis支持通过XML中的<if><choose><when><otherwise>等标签动态生成SQL语句。
    • 这些标签允许根据条件动态拼接SQL,提高灵活性。
  1. 缓存机制
    • MyBatis提供了两级缓存:
      • 一级缓存:SqlSession级别的缓存,同一个SqlSession中重复执行相同的查询语句时,会直接从缓存中获取结果。
      • 二级缓存:Mapper级别的缓存,多个SqlSession可以共享缓存数据。
  1. 插件机制
    • MyBatis支持插件(Interceptor),可以通过插件机制拦截和修改ExecutorStatementHandlerResultSetHandler等组件的行为,实现日志记录、性能监控等功能。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 2:36:26

Leetcode会员尊享100题:270.最接近的二叉树值

给你二叉搜索树的根节点 root 和一个目标值 target &#xff0c;请在该二叉搜索树中找到最接近目标值 target 的数值。如果有多个答案&#xff0c;返回最小的那个。示例 1&#xff1a;输入&#xff1a;root [4,2,5,1,3], target 3.714286 输出&#xff1a;4示例 2&#xff1a…

作者头像 李华
网站建设 2026/5/3 19:13:09

三步让阿里云配置好 clawdbot(moltbot)附上专属优惠

就在刚刚&#xff08;2026年1月28日&#xff09;&#xff0c;阿里云正式宣布上线 Moltbot&#xff08;原名&#xff1a;Clawdbot&#xff09; 全套云服务&#xff01;这对于想做AI Agent的开发者来说是个重磅消息。它全面提供了Agent所需的算力、模型和消息应用支持 。 简单来…

作者头像 李华
网站建设 2026/4/30 22:04:54

腾讯地图:2026 年的技术革新与应用拓展

在 2026 年&#xff0c;数字化浪潮席卷各行各业&#xff0c;地图服务作为连接物理与数字世界的关键纽带&#xff0c;其重要性愈发凸显。腾讯地图凭借一系列技术革新与应用优化&#xff0c;成为了众多企业和开发者的首选。 强大技术架构支撑 腾讯地图拥有从 LBS 到时空引擎的进…

作者头像 李华
网站建设 2026/5/1 14:18:37

宠物寄养小程序前端功能版块详解

宠物寄养小程序以场景化前端功能为支撑&#xff0c;打通宠主寄养需求与机构服务能力的对接通道&#xff0c;既缓解宠主外出时的照料焦虑&#xff0c;又助力寄养机构规范服务流程。其前端设计围绕需求精准匹配、服务过程可视化、操作便捷化三大核心&#xff0c;构建全周期服务功…

作者头像 李华
网站建设 2026/5/2 17:43:03

用AI写英文论文,又用降AIGC系统降AI率,这样做的意义在哪?

有同学直接用AI完成英文论文后发现论文AIGC率高&#xff0c;又用降AIGC系统把论文AI率降低&#xff0c;这么做的意义在哪&#xff1f; 自从AI问世以来&#xff0c;很多需要写论文的学生发现这类AI工具简直就是对于写作困难的人的大救星&#xff0c;利用AI工具可以完成各类论文…

作者头像 李华
网站建设 2026/5/2 18:39:03

凌晨两点还在调 Dify 环境?我后悔没早点知道 Sealos

那是一个普通的周三&#xff0c;产品经理下午三点甩来需求&#xff1a;"咱们搭个 AI 客服系统&#xff0c;用 Dify 对接 DeepSeek&#xff0c;下周演示。" 我心想&#xff1a;小场面。 然后时间快进到凌晨两点&#xff0c;我对着屏幕上第 47 次报错的 Docker Compose…

作者头像 李华