[toc]
| 单词 | 词性 | 音标 | 含义 |
|---|---|---|---|
| Table | n. | /ˈteɪbl/ | 表(@TableName 指定实体类对应的数据库表名) |
| Id | n. | /aɪˈdiː/ | 标识(@TableId 指定主键字段,可配置主键生成策略) |
| Field | n. | /fiːld/ | 字段(@TableField 指定属性对应的数据库列名,处理命名不一致等场景) |
| Exist | v. | /ɪɡˈzɪst/ | 存在(@TableField(exist = false) 表示该属性在表中不存在对应列) |
Lecture03-实体类与常用注解
一、默认映射规则
MyBatis-Plus 在实体类和表之间有一套默认映射规则,大部分情况下我们什么都不用做:
| 映射对象 | 默认规则 | 示例 |
|---|---|---|
| 类名 → 表名 | 类名直接作为表名 | Employee → 表 employee |
| 属性 → 列名 | 驼峰命名自动转下划线 | empId → 列 emp_id |
表名默认是类名,所以第 2 章中表叫
t_emp、类叫Employee时,必须用@TableName("t_emp")显式指定。
二、@TableName:指定表名
当类名和表名不一致时使用:
@Data
@TableName("t_emp")
public class Employee {
// ...
}
常见场景:
- 表名带前缀:
t_emp、t_dept、t_tiger,类名是Employee、Dept、Tiger - 表名与类名完全不同
补充:全局配置表前缀
如果工程中所有表都有相同前缀(例如都是 t_ 开头),可以在配置文件中统一配置,实体类上就不用每个都写:
mybatis-plus.global-config.db-config.table-prefix=t_
配置后:类 Employee → 表 t_employee(框架自动加前缀)。不过本教程的表是 t_emp,前缀规则拼不出来,所以仍然在实体类上用 @TableName 显式指定。
三、@TableId:指定主键
主键字段默认规则:属性名是 id 时自动识别为主键;不是 id(比如我们的 empId),需要 @TableId 指定。
@TableId(type = IdType.AUTO)
private Integer empId;
1、IdType 主键策略
| 策略 | 说明 | 使用场景 |
|---|---|---|
IdType.AUTO | 数据库自增(依赖表主键 AUTO_INCREMENT) | 我们课程使用,最常用 |
IdType.ASSIGN_ID | 框架生成雪花算法 ID(19 位数字,全局唯一) | 分布式系统、不方便依赖数据库自增时 |
IdType.INPUT | 自己传入主键值,框架不管 | 主键由业务代码生成 |
IdType.NONE | 当前实体类自己不指定,跟随全局配置 | 默认 |
2、ASSIGN_ID 示例
如果某张表的主键不是自增,想让框架帮我们生成唯一 ID:
@TableId(type = IdType.ASSIGN_ID)
private Long id; // 注意:雪花 ID 数值很大,用 Long 接收
调用 insert 插入后,这个 id 会被框架自动回填到对象中。
四、@TableField:指定列名
当属性名和列名无法通过驼峰规则对应时,用 @TableField 手动指定。常用场景:
1、列名与属性名不一致
@TableField("phone_num") // 属性是 phoneNum,列名就是 phone_num 时其实可以省略
private String phoneNum;
注意:
phoneNum→phone_num是驼峰规则的正常对应,这个写法其实可省略。真正需要手动指定的是驼峰转不出来、或者表列名本身特殊的场景,例如:@TableField(value = "phone_num") private String phoneNumHappy;
2、属性在表中没有对应列
例如实体类中有一个「页面展示用」的属性,数据库表里没有这一列。如果不处理,框架会认为它对应一个不存在的列,增删改查都会报错:
@TableField(exist = false) // 告诉框架:这个属性在表中不存在
private String deptName; // 例如:冗余的部门名称,仅用于页面展示
3、查询时不想返回某个列
例如手机号属于敏感信息,查询时默认不查出来:
@TableField(select = false) // 生成 SQL 时不包含这一列
private String phoneNum;
使用后,查询结果中该属性为 null;需要时可以用条件构造器
select()临时把它查出来(第 5 章)。
五、图解:实体类与表字段映射
对照上图理解:
empId↔emp_id:驼峰自动转换,无需注解phoneNum↔phone_num:同理自动转换(图上为了说明 @TableField 的用法做了标注)- 类
Employee↔ 表t_emp:必须@TableName("t_emp")指定
六、注解速查表
| 注解 | 位置 | 作用 | 常用属性 |
|---|---|---|---|
@TableName("表名") | 类上 | 指定实体类对应的表 | value:表名 |
@TableId | 主键属性上 | 指定主键 | type:主键策略(IdType.AUTO / ASSIGN_ID / INPUT) |
@TableField | 属性上 | 指定列名或控制字段行为 | value:列名;exist=false:表中无此列;select=false:查询不返回;fill:自动填充策略(第 9 章) |
@TableLogic | 属性上 | 逻辑删除字段(第 9 章) | value:删除值;delval:未删除值 |
@Version | 属性上 | 乐观锁版本号(第 10 章) | - |
第 9、10 章会用到的
@TableLogic、@Version、@TableField(fill=...)先混个脸熟,后面用到再细讲。
七、本章小结
- 默认规则:类名 → 表名,驼峰属性 → 下划线列名,自动完成
@TableName:表名和类名不一致时指定表名@TableId:指定主键,IdType.AUTO最常用(自增)@TableField:列名特殊、属性不存在对应列、不想查询某列时使用- 记住一句话:命名规规矩矩,注解用得最少
下一章学习 BaseMapper 的内置增删改查方法。