当前位置: 首页 > news >正文

Mybatis执行流程知多少

思维导图:

 

 

一、MyBatis 执行流程概述

  MyBatis 的执行流程可以大致分为以下几个关键步骤:配置加载、会话创建、SQL 执行和结果处理。下面我们将逐步详细介绍每个步骤。

二、配置加载


1. 配置文件的重要性

  MyBatis 的配置文件是整个框架的基础,它包含了数据库连接信息、映射器配置、插件配置等重要内容。常见的配置文件有 mybatis-config.xml 和映射器 XML 文件(如 UserMapper.xml)。

如图所示:

2. 加载配置文件

  在 Java 代码中,我们通常使用 SqlSessionFactoryBuilder 来加载配置文件并构建 SqlSessionFactory。示例代码如下:

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;public class MyBatisConfigLoader {public static SqlSessionFactory getSqlSessionFactory() throws Exception {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);return new SqlSessionFactoryBuilder().build(inputStream);}
}

  在上述代码中,Resources.getResourceAsStream(resource) 方法用于读取配置文件SqlSessionFactoryBuilder().build(inputStream) 方法根据配置文件构建 SqlSessionFactory

3. 配置文件解析

SqlSessionFactoryBuilder 在构建 SqlSessionFactory 时,会对配置文件进行详细的解析。它会读取配置文件中的数据库连接信息、映射器配置等,并将这些信息存储在 Configuration 对象中。Configuration 对象是 MyBatis 配置信息的核心载体,后续的操作都会依赖于它。

具体来说,SqlSessionFactoryBuilder 会使用 XML 解析器对配置文件进行解析,将其中的 XML 标签转换为 Java 对象。例如,<dataSource> 标签会被解析为 DataSource 对象,<mapper> 标签会被解析为映射器对象。在解析过程中,SqlSessionFactoryBuilder 会对配置信息进行验证和处理,确保配置信息的正确性和完整性。

三、会话创建

1. SqlSessionFactory 的作用

  SqlSessionFactory 是 MyBatis 的核心对象之一,它负责创建 SqlSession 对象。SqlSession 是 MyBatis 与数据库交互的会话对象,类似于 JDBC 中的 Connection。SqlSessionFactory 是一个线程安全的对象,通常在应用程序启动时创建一次,并在整个应用程序的生命周期中使用。

2. 创建 SqlSession

  通过 SqlSessionFactory 的 openSession() 方法可以创建一个 SqlSession 对象。openSession() 方法有多个重载形式,可以根据需要指定是否自动提交事务、隔离级别等参数。代码示例:

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;public class MyBatisSessionCreator {public static SqlSession getSqlSession() throws Exception {SqlSessionFactory sqlSessionFactory = MyBatisConfigLoader.getSqlSessionFactory();return sqlSessionFactory.openSession();}
}

3. 会话管理

  SqlSession 对象在使用完毕后需要关闭,以释放资源。可以使用 try-with-resources 语句来确保 SqlSession 正确关闭。try-with-resources 语句是 Java 7 引入的一种自动资源管理机制,它会在代码块执行完毕后自动调用资源的 close() 方法。以下是一个示例:

try (SqlSession session = MyBatisSessionCreator.getSqlSession()) {// 执行数据库操作
}

四、SQL 执行

1. 获取映射器

在 SqlSession 中,可以通过 getMapper() 方法获取映射器接口的实例。映射器接口定义了数据库操作的方法,MyBatis 会根据接口方法的定义自动生成对应的 SQL 语句。示例代码如下:

import org.apache.ibatis.session.SqlSession;public class MyBatisMapperExecutor {public static void executeMapperMethod() throws Exception {try (SqlSession session = MyBatisSessionCreator.getSqlSession()) {UserMapper userMapper = session.getMapper(UserMapper.class);// 调用映射器方法}}
}

2. 执行 SQL 语句

  当调用映射器接口的方法时,MyBatis 会根据方法的定义和映射器配置文件(或注解)生成对应的 SQL 语句,并通过 Executor 执行该 SQL 语句Executor 是 MyBatis 执行 SQL 语句的核心组件,它负责与数据库建立连接、执行 SQL 语句、处理事务等操作。

  MyBatis 提供了两种类型的 Executor:SimpleExecutor 和 ReuseExecutor。SimpleExecutor 每次执行 SQL 语句时都会创建一个新的 PreparedStatement 对象,而 ReuseExecutor 会重用已经创建的 PreparedStatement 对象,以提高性能。


3. SQL 语句的生成

MyBatis 支持 XML 配置和注解两种方式来定义 SQL 语句。


XML 配置方式

在 XML 配置中,可以在映射器 XML 文件中使用 <select>、<insert>、<update>、<delete> 等标签来定义 SQL 语句。以下是一个示例:

<mapper namespace="com.example.mapper.UserMapper"><select id="getUserById" parameterType="int" resultType="com.example.entity.User">SELECT * FROM users WHERE id = #{id}</select>
</mapper>

 注解方式

在注解方式中,可以在映射器接口的方法上使用 @Select、@Insert、@Update、@Delete 等注解来定义 SQL 语句。以下是一个示例:

import org.apache.ibatis.annotations.Select;public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User getUserById(int id);
}

五、结果处理

1. 结果集映射

当 SQL 语句执行完毕后,MyBatis 会将数据库返回的结果集映射到 Java 对象中。可以通过映射器配置文件或注解来定义结果集映射规则。

XML 配置方式

在 XML 配置中,可以使用 <resultMap> 标签来定义结果集映射。以下是一个示例:

<mapper namespace="com.example.mapper.UserMapper"><resultMap id="userResultMap" type="com.example.entity.User"><id property="id" column="id" /><result property="name" column="name" /><result property="age" column="age" /></resultMap><select id="getUserById" parameterType="int" resultMap="userResultMap">SELECT * FROM users WHERE id = #{id}</select>
</mapper>

注解方式

  在注解方式中,可以使用 @Results 和 @Result 注解来定义结果集映射。以下是一个示例:

import org.apache.ibatis.annotations.*;public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")@Results({@Result(property = "id", column = "id"),@Result(property = "name", column = "name"),@Result(property = "age", column = "age")})User getUserById(int id);
}

2. 返回结果

  经过结果集映射后,MyBatis 会将映射后的 Java 对象作为方法的返回值返回给调用者。调用者可以直接使用这些 Java 对象进行业务逻辑处理。

六.执行流程总结

MyBatis 的执行流程包含以下关键环节:

  • 读取 MyBatis 配置文件 mybatis - config.xml,加载运行环境及映射文件,为后续数据库操作做好基础配置准备。
  • 依据加载的配置构造会话工厂 SqlSessionFactory,它是创建数据库会话的核心工厂。
  • 通过会话工厂创建 SqlSession 对象,该对象包含执行 SQL 语句的所有方法,是与数据库交互的直接会话实例。
  •  实际操作数据库时,使用 Executor 执行器,它不仅负责 SQL 语句的执行,还承担着查询缓存的维护工作。
  • 在 Executor 接口的执行方法中,存在一个 MappedStatement 类型的参数,该参数封装了映射信息(如 SQL 语句、结果映射规则等),是 SQL 执行的关键数据载体。
  • 执行 SQL 前,进行输入参数映射,将传入的参数按规则正确应用到 SQL 语句中。
  • SQL 执行完成后,进行输出结果映射,把数据库返回的结果按配置规则映射到相应的对象中,至此完成整个数据操作流程。

http://www.xdnf.cn/news/281485.html

相关文章:

  • 2025年- H25-Lc133- 104. 二叉树的最大深度(树)---java版
  • 栈系列一>字符串解码
  • 2021年第十二届蓝桥杯省赛B组C++题解
  • TS 变量类型生成
  • 构建良好的 AI 文化:解锁未来的密钥
  • **电商推荐系统设计思路**
  • 数字信号处理学习笔记--Chapter 1 离散时间信号与系统
  • 算法竞赛进阶指南.闇の連鎖
  • TF-IDF与CountVectorizer、TfidfVectorizer的联系与区别
  • C++日志系统实现(一)
  • 每日c/c++题 备战蓝桥杯(洛谷P1190 [NOIP 2010 普及组] 接水问题)
  • 56认知干货:智能化产业
  • 2025-05-04 Unity 网络基础6——TCP心跳消息
  • TestBench激励与待测
  • 配置和使用持久卷
  • 如何克服情绪拖延症?
  • ​​工业机器人智能编程:从示教器到AI自主决策​​
  • [Java]Java的三个阶段
  • htop电脑性能检测
  • MYSQL数据库突然消失
  • 【漫话机器学习系列】238.训练误差与测试误差(Training Error And Test Error)
  • [特殊字符] 人工智能大模型之开源大语言模型汇总(国内外开源项目模型汇总) [特殊字符]
  • 引入spdlog后程序链接很慢
  • 使用 OpenCV 和 Dlib实现轮廓绘制
  • 「Mac畅玩AIGC与多模态18」开发篇14 - 多字段输出与结构控制工作流示例
  • 【MySQL】用户管理
  • Javascript学习笔记1——数据类型
  • 【哈希表的简单介绍】
  • Python|Pyppeteer实现自动登录小红书(32)
  • PyQt5基本介绍