ORM 是什么
对象-关系映射动机;与原生 SQL 分工。
30 分钟
ORM 是什么
CodeRoadMap 后端用 MySQL 存 cf_track、cf_lesson 等表,Java 代码里却是 Track、Lesson 对象。ORM(Object-Relational Mapping)负责在对象与表行之间翻译。
学习目标
- 理解 ORM 要解决的「阻抗不匹配」
- 知道 ORM 与手写 SQL 的分工
- 对照本站 MyBatis + JPA 混用场景
阻抗不匹配
| 面向对象 | 关系数据库 |
|---|---|
| 类、继承 | 表、无外键继承 |
引用(track.lessons) | 外键 track_id |
| 懒加载、级联 | JOIN、触发器 |
ORM 框架(Hibernate/JPA、MyBatis)把 持久化细节 从业务代码里抽离,让你用 Java 类型思考,而不是满屏 ResultSet。
在本站架构里
Controller → Service → Repository / Mapper → MySQL
↑
JPA Entity 或 MyBatis XML
- JPA:
TrackRepository.findBySlug()自动生成 SQL - MyBatis:复杂报表、批量更新写 XML,可控性高
同一项目可并存,但 域模型应统一,避免一张表两套 POJO。
何时用 ORM、何时写 SQL
| 场景 | 倾向 |
|---|---|
| CRUD、按字段查询 | JPA / Spring Data |
| 多表 JOIN + 动态条件 | MyBatis |
| 报表、窗口函数 | 原生 SQL / MyBatis |
| 学习 SQL 本身 | sql-essentials |
ORM 不是替代 SQL——不懂 SQL 的 ORM 工程师会写出 N+1 和慢查询。
相关课程
- 前置:sql-intro、sql-design
- 实践:sb-jpa、sb-jdbc
- 非关系型对比:mongo-vs-sql
练习
- 打开
schema.sql,找到cf_lesson.track_id外键 - 在 backend 搜索 或 ,判断用的是 JPA 还是 MyBatis