1514 字
约 5 分钟
1
MyBatis 入门

MyBatis 入门

1. 一句话简介

MyBatis 是一款半自动化的 SQL 持久层框架,通过将 SQL 语句与 Java 方法绑定,让开发者手写并完全掌控每条 SQL,同时由框架完成参数设置、结果集到实体对象的映射。本 demo 模块(demo-orm-mybatis)演示了它如何借助 mybatis-spring-boot-starter 与 Spring Boot 无缝整合:启动类用 @MapperScan 批量扫描 Mapper 接口,application.yml 通过 map-underscore-to-camel-case 自动把数据库下划线字段(如 phone_number)映射到 Java 驼峰属性(phoneNumber)。它核心解决的是:相比裸 JDBC 手动处理 ResultSet 的样板代码,MyBatis 提供了一条「SQL 可控、映射自动化」的中间路线。在 UserMapper 中可见其两种 SQL 写法——简单查询用 @Select 注解,多字段插入和删除则写在 UserMapper.xml 中。

2. 什么时候使用

  • ✅ 适用场景
    • 需要精细化的 SQL 控制:性能敏感或逻辑复杂的查询希望手写并调优 SQL,而非交给框架自动生成(如多表关联、分页、聚合,MyBatis 的 <if><foreach> 动态 SQL 可直接表达)。
    • 数据库是下划线命名、Java 是驼峰命名的团队:开启 map-underscore-to-camel-case 即可自动映射,无需为每个字段写 resultMap 注解,开发成本低。
    • 团队以 SQL 思维为主、DBA 友好的项目:SQL 单独放在 XML 中或注解中,DB 人员可直接读取、评审、优化,无需理解 ORM 注解体系。
    • 国内 Java 生态、希望后续接 MyBatis-Plus 等增强框架:MyBatis 在国内占据主流,进阶可平滑升级到通用 Mapper、分页插件。
    • 需要 SQL 与代码分离、热更新便利的场景:XML 修改后无需重新编译 Java 类,便于 SQL 调整。
  • ❌ 不适用/需谨慎
    • 纯 CRUD、追求最少代码:每个方法都要手写 SQL(本模块 saveUser 的 INSERT 需列出 9 个字段),简单增删改查反而繁琐,不如 JPA 或 MyBatis-Plus 的通用 Mapper 零 SQL。
    • 以对象模型为核心、强关系映射(如多对多/继承)的领域模型:MyBatis 需要手写 JOIN 和嵌套 resultMap,相比 JPA 的 @ManyToMany 更繁琐。
    • 异地/多数据库方言差异大:SQL 与具体数据库耦合,切换数据库需手动改 SQL,缺少 JPA 的方言自动抽象。
    • 无经验的纯 CRUD 场景:若项目主要价值是业务逻辑而非 SQL 优化,Spring Data JPA 的开发效率优势更明显。

3. 常见业务场景

  • 用户信息 CRUD 管理:如本 demo 的 orm_user 表,selectAllUser/selectUserById/saveUser/deleteById 构成一套标准数据访问。MyBatis 控制器全、SQL 直观,适合先搭出基础数据层再逐步扩展。
  • 带条件筛选的列表查询:真实列表常伴随动态查询条件(按状态、时间、关键词),MyBatis 的 <if> 动态 SQL 能按条件拼接 WHERE,契合这种「可空参数、多种组合」的检索需求。
  • 字段下划线转驼峰的实体映射:数据库列名使用 phone_numbercreate_time 等下划线惯例时,开启 map-underscore-to-camel-case 即自动对齐 Java 的 phoneNumbercreateTime,减少大量手写映射(本模块的 User.java 正是无注解纯 POJO)。
  • 敏感信息加密落库:demo 中密码以 MD5(明文 + salt) 存储,salt 逐用户随机。这类有特殊 SQL 逻辑(写入前加密、按盐校验)的字段操作,手写 SQL 更具可读性和可控性。
  • 单表写入、字段较多且数据库提供默认值的场景orm_userstatuscreate_time 由数据库 DEFAULT 填充,INSERT 只需指定业务字段。MyBatis 的 XML <insert> 可精确控制插入列、依赖数据库默认值。

4. 同类技术对比

维度 MyBatis Spring Data JPA (Hibernate) MyBatis-Plus Spring JdbcTemplate
SQL 控制力 完全掌控,手写每条 SQL 自动生成,复杂查询需 @Query/Specification 继承 MyBatis,通用 CRUD 自动生成,复杂仍手写 完全掌控,手写 SQL
开发效率 需手写 SQL,基础 CRUD 略繁琐 简单 CRUD 零 SQL,效率高 极高,通用 Mapper 内置增删改查 低,需手动结果映射
复杂查询/动态 SQL 灵活,<if>/<foreach> 强大 不擅长,Specification 繁琐 优秀,MyBatis 全能力 + 分页插件 需手写拼接,尚可
实体要求 纯 POJO,无注解,靠列名映射 @Entity@Column 等注解驱动 纯 POJO,注解可选 纯 POJO
结果映射 自动(下划线转驼峰) 自动,关系映射出色 自动 手写 RowMapper,样板多
学习成本 中等,需学 XML 语法;SQL 驱动直观 中高,面向对象与关系映射概念多 低,透明包装 MyBatis 低,但样板多
数据库方言封装 无,SQL 与库耦合 强,方言自动适配
国内生态 主流,进阶框架丰富 国外主流,国内使用较少 国内非常流行 轻量,教学常用

选型建议:如果项目以 SQL 优化、精细化查询为主,或团队 DBA 友好,选原生 MyBatis(本 demo 路线)。若需求是大量简单 CRUD、希望最省代码,优先 MyBatis-Plus(通用 Mapper + 分页插件),它无缝兼容原生 MyBatis,可先后迁移。若以面向对象的领域模型为核心、注重多数据库方言适配与关系映射,选 Spring Data JPA。若只是简单打通数据库、无需框架层的轻量场景,Spring JdbcTemplate 足够且零额外学习成本。在国内常规 Java 业务项目中,MyBatis(及其增强 MyBatis-Plus)通常是性价比最高的默认选择。

MyBatis 入门
http://clxhxhhr.top/posts/496/
作者
clxstart
发布于
2026-09-07
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。