news 2026/5/11 10:47:50

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/10 9:34:10

蒙特卡洛模拟电动汽车的有序充放电策略及其在优化调度、微电网与综合能源、储能、新能源方向的基础入...

蒙特卡洛模拟电动汽车有序充放电(matlab)&#xff0c;适合优化调度&#xff0c;微电网&#xff0c;综合能源、储能、新能源方向的基础入门学习 最近在折腾电动汽车充放电调度的问题&#xff0c;发现蒙特卡洛模拟真是个神器。今天咱们就用Matlab整点有意思的——模拟100辆电动汽…

作者头像 李华
网站建设 2026/5/10 17:27:06

​三拼域名chaojidao.com深度点评​

三拼域名chaojidao.com深度点评 核心结论&#xff1a;chaojidao.com是一枚含义明确、行业属性强、终端潜力巨大的优质三拼域名&#xff0c;尤其在农业科技与食品领域具备突出价值&#xff0c;同时存在 "小米超级岛" 概念的跨界联想空间&#xff0c;建议长期持有并重…

作者头像 李华
网站建设 2026/5/11 0:08:05

漏洞扫描十大工具

漏洞扫描十大工具 AwVS AwVS是一款知名的Web网络漏洞扫描工具&#xff0c;它通过网络爬虫测试你的网站安全&#xff0c;检测流行安全漏洞。 a)、自动的客户端脚本分析器&#xff0c;允许对Ajax和Web 2.0应用程序进行安全性测试 b)、业内最先进且深入的SQL 注入和跨站脚本测试…

作者头像 李华
网站建设 2026/5/10 23:44:12

Redshift vs Octane 深度对比:哪款渲染器更适合 Cinema 4D 工作流程?

在 Cinema 4D 的世界里&#xff0c;选择合适的 GPU 渲染器能够显著提升你的创作效率和渲染质量。当前主流的两个选择是 Redshift 和 OctaneRender&#xff0c;它们各有特点&#xff0c;适合不同风格的项目需求。本文将从核心性能和工作流程体验角度&#xff0c;为你做一个清晰对…

作者头像 李华
网站建设 2026/5/10 9:29:03

【vtkPolyDataPointSampler 】——多边形数据点采样技术详解

VTK核心类解析:vtkPolyDataPointSampler 多边形数据点采样技术详解 简单说,vtkPolyDataPointSampler 就是 VTK里的 “点生成器”—— 专门给 3D 模型(比如三角形、多边形组成的物体)表面或内部,按需求打一堆采样点,生成的点云能直接用在后续的可视化、建模或计算里。 一…

作者头像 李华
网站建设 2026/5/10 13:51:28

电子签章选型指南:云巨头生态服务与垂直专业厂商的六大维度解析

随着电子签章应用在市场越来越普及和受追捧&#xff0c;超级大厂也相继推出了自己的电子签章产品&#xff0c;如华为的华为云电子签、阿里的阿里云电子签、腾讯的腾讯电子签服务。那这些大厂推出的电子签章产品和服务与传统第三方电子签公司北京安证通有什么相同和区别呢&#…

作者头像 李华