菜单

MyBatis 和 ORM

相关源文件

本页面概述了 MyBatis,这是一款流行的 Java 应用程序 SQL 映射框架,并解释了它如何融入更广泛的对象关系映射 (ORM) 概念。 与完整的 ORM 解决方案相比,MyBatis 充当 Java 应用程序和关系数据库之间的中间层,提供了一种更灵活且以 SQL 为中心的方法。

什么是 ORM?

对象关系映射 (ORM) 是一种编程技术,它通过映射来创建“虚拟对象数据库”

  • 数据库表到 Java 类
  • 表记录到对象
  • 表列到对象属性

这允许开发人员使用面向对象的范例而不是直接使用 SQL 语句来处理数据库数据。

来源:docs/database/basis.md, docs/open-source-project/system-design.md

MyBatis 与传统 ORM

MyBatis 与像 Hibernate 这样的完整 ORM 框架的不同之处在于,它提供了一种以 SQL 为中心的方法

功能传统 ORM(例如,Hibernate)MyBatis
SQL 控制抽象掉 SQL开发人员直接编写 SQL
学习曲线更陡峭对于 SQL 开发人员来说更容易上手
数据库优化可能具有挑战性直接 SQL 允许优化
映射复杂性自动处理复杂的映射需要手动映射配置
事务管理内置通过集成(例如,Spring)

MyBatis 通常被描述为“半自动 ORM 映射工具”,因为它确实提供了对象关系映射功能,但它要求开发人员手动编写 SQL 语句。

来源:docs/system-design/framework/mybatis/mybatis-interview.md

MyBatis 架构

下图说明了 MyBatis 的高级架构以及它如何融入典型的 Java 应用程序

关键组件

  1. SqlSessionFactory:创建 SqlSession 实例并管理其生命周期
  2. SqlSession:用于执行 SQL 命令的主要接口
  3. Executor:处理 SQL 语句的执行并管理缓存
  4. Mapped Statement:表示配置中的单个 SQL 语句
  5. TypeHandler:在 Java 类型和 JDBC 类型之间进行转换
  6. ResultSetHandler:将数据库结果映射到 Java 对象

来源:docs/system-design/framework/mybatis/mybatis-interview.md

MyBatis 的核心功能

1. 基于 XML 的 SQL 映射

MyBatis 允许开发人员在 XML 文件中定义 SQL 语句,从而将 SQL 与 Java 代码分离

在典型的 MyBatis 应用程序中,映射在与 Java 接口(Mapper)对应的 XML 文件中定义

来源:docs/system-design/framework/mybatis/mybatis-interview.md

2. 动态 SQL

MyBatis 最强大的功能之一是它支持动态 SQL 构建,从而允许有条件地组合查询

MyBatis 提供了 9 个动态 SQL 标签

  • <if>
  • <where> (也相关: trim, set)
  • <choose> (with when, otherwise)
  • <foreach>
  • <bind>

来源:docs/system-design/framework/mybatis/mybatis-interview.md

3. 参数处理

MyBatis 在 SQL 语句中提供两种类型的参数标记

  1. #{parameter}:创建一个 PreparedStatement 参数占位符 (?) 并安全地设置参数值
  2. ${parameter}:直接文本替换(由于存在 SQL 注入风险,应谨慎使用)

这种区别对于安全性和性能都非常重要

来源:docs/system-design/framework/mybatis/mybatis-interview.md

与 Spring 集成

MyBatis 可以使用 Spring Boot starters 轻松地与 Spring Framework 集成,从而减少了样板配置代码

Spring 集成简化了

  • Mapper 注入
  • 事务管理
  • 连接池配置
  • 异常处理

来源:docs/open-source-project/system-design.md

MyBatis-Plus

MyBatis-Plus 是 MyBatis 的增强工具,通过提供以下功能来简化开发

  • 自动生成的 CRUD 方法
  • 分页支持
  • SQL 注入器
  • 性能优化工具
  • 代码生成器

MyBatis-Flex

MyBatis-Flex 是另一个优雅的 MyBatis 增强框架,它支持

  • CRUD 操作
  • 分页
  • 多表查询
  • 批量操作

来源:docs/open-source-project/system-design.md:74-76

性能考量

使用 MyBatis 时,请考虑以下性能优化策略

  1. 适当的 Executor 选择

    • SimpleExecutor:为每个语句打开和关闭连接
    • ReuseExecutor:重用 Statement 对象
    • BatchExecutor:批量处理语句以获得更好的性能
  2. 缓存

    • 一级缓存(会话级别)
    • 二级缓存(应用程序级别)
  3. 分页

    • 对于大型数据集,请使用数据库原生分页而不是 RowBounds
  4. N+1 查询问题

    • 使用 association/collection 获取相关数据
    • 考虑对一对一关系使用 join fetching

来源:docs/system-design/framework/mybatis/mybatis-interview.md

常见用例和最佳实践

关联映射

MyBatis 提供了灵活的方式来处理对象之间的关系

  1. 一对一关系

    • 使用 <association> 标签
  2. 一对多关系

    • 使用 <collection> 标签
  3. 延迟加载

    • 通过配置为关联和集合启用
    • 使用 CGLIB 代理实现

来源:docs/system-design/framework/mybatis/mybatis-interview.md

批处理

对于大型数据操作,MyBatis 提供了批处理功能

来源:docs/system-design/framework/mybatis/mybatis-interview.md

结论

MyBatis 在 Java 应用程序中提供了一种平衡的数据库访问方法,使开发人员可以直接控制 SQL,同时仍然提供对象映射功能。 它的灵活性使其特别适用于具有复杂查询或性能关键型操作的应用程序,在这些应用程序中,对 SQL 的控制非常重要。

对于更复杂的 ORM 需求,如果希望抽象掉 SQL,您可能需要探索完整的 ORM 解决方案,例如 Hibernate。 有关系统设计中使用的其他框架的更多信息,请参见Spring Framework