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 调整。
- 需要精细化的 SQL 控制:性能敏感或逻辑复杂的查询希望手写并调优 SQL,而非交给框架自动生成(如多表关联、分页、聚合,MyBatis 的
- ❌ 不适用/需谨慎
- 纯 CRUD、追求最少代码:每个方法都要手写 SQL(本模块
saveUser的 INSERT 需列出 9 个字段),简单增删改查反而繁琐,不如 JPA 或 MyBatis-Plus 的通用 Mapper 零 SQL。 - 以对象模型为核心、强关系映射(如多对多/继承)的领域模型:MyBatis 需要手写 JOIN 和嵌套 resultMap,相比 JPA 的
@ManyToMany更繁琐。 - 异地/多数据库方言差异大:SQL 与具体数据库耦合,切换数据库需手动改 SQL,缺少 JPA 的方言自动抽象。
- 无经验的纯 CRUD 场景:若项目主要价值是业务逻辑而非 SQL 优化,Spring Data JPA 的开发效率优势更明显。
- 纯 CRUD、追求最少代码:每个方法都要手写 SQL(本模块
3. 常见业务场景
- 用户信息 CRUD 管理:如本 demo 的
orm_user表,selectAllUser/selectUserById/saveUser/deleteById构成一套标准数据访问。MyBatis 控制器全、SQL 直观,适合先搭出基础数据层再逐步扩展。 - 带条件筛选的列表查询:真实列表常伴随动态查询条件(按状态、时间、关键词),MyBatis 的
<if>动态 SQL 能按条件拼接 WHERE,契合这种「可空参数、多种组合」的检索需求。 - 字段下划线转驼峰的实体映射:数据库列名使用
phone_number、create_time等下划线惯例时,开启map-underscore-to-camel-case即自动对齐 Java 的phoneNumber、createTime,减少大量手写映射(本模块的User.java正是无注解纯 POJO)。 - 敏感信息加密落库:demo 中密码以
MD5(明文 + salt)存储,salt 逐用户随机。这类有特殊 SQL 逻辑(写入前加密、按盐校验)的字段操作,手写 SQL 更具可读性和可控性。 - 单表写入、字段较多且数据库提供默认值的场景:
orm_user的status、create_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)通常是性价比最高的默认选择。
评论
0 条
还没有评论,先写一条吧。