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

3. MyBatis 执行原理了解吗?

MyBatis 是一个半自动化的持久层框架,它通过配置文件或注解将 SQL 语句与 Java 对象进行映射,从而简化数据库访问操作。MyBatis 的执行原理涉及多个核心组件和步骤,以下是对 MyBatis 执行原理的详细说明:

1. MyBatis 的核心组件

  • SqlSessionFactory:用于创建 SqlSession 对象的工厂。它是 MyBatis 框架的核心,负责读取配置文件和管理 MyBatis 的资源。

  • SqlSession:表示与数据库交互的会话。通过 SqlSession,开发者可以执行 SQL 语句、获取映射的 Java 对象、管理事务等。SqlSession 不是线程安全的,通常应该在方法中创建并使用,使用后立即关闭。

  • Executor:MyBatis 中的执行器,负责执行映射语句、调用映射器(Mapper)接口方法、处理缓存等。Executor 是 MyBatis 内部执行 SQL 的核心组件。

  • MappedStatement:表示 MyBatis 中的映射语句(如 <select><insert><update><delete>)。每个映射语句对应一个 MappedStatement 对象,它包含了执行 SQL 所需的全部信息。

  • Configuration:全局配置类,包含了 MyBatis 的所有配置,如环境信息、映射器(Mapper)信息、类型处理器、插件等。

  • Cache:MyBatis 中的缓存机制。MyBatis 提供了一级缓存(默认开启,基于 SqlSession)和二级缓存(可选配置,基于 Mapper 映射器级别)。

2. MyBatis 的执行流程

MyBatis 的执行流程通常包括以下几个步骤:

2.1. 创建 SqlSessionFactory

  • MyBatis 的执行流程从加载配置文件并创建 SqlSessionFactory 开始。通过 SqlSessionFactoryBuilder 读取 MyBatis 的配置文件(如 mybatis-config.xml)或通过代码配置,MyBatis 会构建 Configuration 对象,解析所有 Mapper 文件,并将这些信息注册到 Configuration 中。

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

2.2. 获取 SqlSession

  • 通过 SqlSessionFactory 获取 SqlSession 对象。SqlSession 是 MyBatis 与数据库交互的核心接口,所有的数据库操作都通过它来完成。

SqlSession sqlSession = sqlSessionFactory.openSession();

2.3. 执行 SQL 语句

  • 通过 SqlSession 调用 Mapper 接口的方法,MyBatis 内部会将这些方法调用映射到相应的 SQL 语句上。

UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
  • MyBatis 首先会通过

    MappedStatement

    获取相应的 SQL 语句,然后通过

    Executor

    执行 SQL。执行过程如下:

    1. 参数处理MappedStatement 中的 SQL 语句通常包含占位符(如 #{id})。MyBatis 会根据传入的参数解析这些占位符,并生成实际的 SQL 语句。

    2. SQL 执行Executor 会根据生成的 SQL 语句,通过 JDBC 与数据库交互,执行 SQL。

    3. 结果映射Executor 执行 SQL 后,返回的结果集会通过 ResultSetHandler 映射为 Java 对象或集合。这一步是 MyBatis 自动将数据库结果集转换为应用程序中定义的 POJO。

2.4. 处理缓存

  • MyBatis 在执行 SQL 语句时,会首先检查缓存(一级缓存和二级缓存)中是否有结果。如果有,直接从缓存中获取结果;如果没有,则执行 SQL 并将结果缓存。

    • 一级缓存:默认开启,作用于 SqlSession 级别。同一 SqlSession 内的相同查询会直接从缓存中获取结果。

    • 二级缓存:可选配置,作用于 Mapper 映射器级别。同一 Mapper 内的相同查询会从二级缓存中获取结果。二级缓存需要在配置文件中显式启用。

2.5. 事务管理

  • MyBatis 的事务管理由 SqlSession 管理。SqlSession 提供了 commit()rollback() 方法来提交或回滚事务。默认情况下,MyBatis 的事务是手动提交的,即需要开发者调用 commit() 方法来提交事务。

try {// 执行SQL操作sqlSession.commit(); // 提交事务
} catch (Exception e) {sqlSession.rollback(); // 回滚事务throw e;
} finally {sqlSession.close(); // 关闭会话
}

2.6. 关闭 SqlSession

  • 每使用完 SqlSession 后,都应该关闭它,以释放数据库连接资源。

sqlSession.close();

3. 总结

  • 配置阶段:MyBatis 通过 SqlSessionFactoryBuilder 读取配置文件并解析所有 Mapper 文件,构建 SqlSessionFactory

  • 会话阶段:通过 SqlSessionFactory 创建 SqlSession,在 SqlSession 中执行 SQL 操作,并管理事务。

  • 执行阶段:MyBatis 通过 MappedStatementExecutor 处理 SQL 语句的执行,处理参数和结果映射,并利用缓存机制优化查询。

  • 关闭会话:执行完操作后,关闭 SqlSession 以释放资源。

MyBatis 的执行原理体现了它作为一个半自动化持久层框架的设计理念,即通过 XML 配置或注解提供灵活的 SQL 操作控制,同时借助 MyBatis 的核心组件实现高效、简洁的数据库访问。


http://www.mrgr.cn/news/18224.html

相关文章:

  • 【C语言】十六进制、二进制、字节、位、指针、数组
  • K8s搭建过程,新手闭眼入!!!超详细教程
  • Win10桌面出现Removable Storage Devices文件夹无法删除
  • python3 whl怎么安装
  • 搭建nmt部署考试系统
  • 【数据结构】Map的使用与注意事项
  • 【无标题】无题 面向对象之封装 无语!
  • 除尘雾炮机的使用成本高吗?
  • 【Java】继承性-方法的重写【主线学习笔记】
  • 2024.9.2 Python,用栈写每日温度,等差数列划分,子串所有可能性,等差数列划分,深度优先搜索解决累加数
  • 【C++】手动实现String类的封装(分文件编译)
  • 【Rust光年纪】化学计算不完全指南:Rust语言库全面解析
  • emmc协议
  • 【计算机网络复习资料】
  • 剪映剪辑影视视频字幕声音批量自动对齐教程
  • 递归 与 dfs 综合练习(四)
  • 中小企业怎么选择MES:专用MES、集成MES和可配置MES
  • 栈和队列
  • SpringBoot链路追踪②:如何集成?
  • 3 指令系统——3.1指令格式