Lecture03-实体类与常用注解

文章目录

    [toc]

    单词词性音标含义
    Tablen./ˈteɪbl/表(@TableName 指定实体类对应的数据库表名)
    Idn./aɪˈdiː/标识(@TableId 指定主键字段,可配置主键生成策略)
    Fieldn./fiːld/字段(@TableField 指定属性对应的数据库列名,处理命名不一致等场景)
    Existv./ɪɡˈ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 的内置增删改查方法。

    end