例:

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("t_user")
public class UserEntity extends Model<UserEntity> {

    private static final long serialVersionUID = 1L;

    /**
     * id
     */
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private Integer id;

    @TableField("username")
    private String username;

    @TableField("realname")
    private String realname;

    @TableField("password")
    private String password;

    @TableField("sex")
    private String sex;

    /**
     * 1:代表未删除  0:代表已删除
     */
    @TableField("status")
    private String status;

    @TableField("registerTime")
    private Date registertime;


    @Override
    protected Serializable pkVal() {
        return this.id;
    }

1. lombok @Accessors

Accessor的中文含义是存取器,@Accessors用于配置getter和setter方法的生成结果,下面介绍三个属性

  1. fluent的中文含义是流畅的,设置为true,则getter和setter方法的方法名都是基础属性名
@Data
@Accessors(fluent = true)
public class User {
    private Long id;
    private String name;
    
    // 生成的getter和setter方法如下,方法体略
    public Long id() {}
    public User id(Long id) {}
    public String name() {}
    public User name(String name) {}
}
  1. chain的中文含义是链式的,设置为true,则setter方法返回当前对象
@Data
@Accessors(chain = true)
public class User {
    private Long id;
    private String name;
    
    // 生成的setter方法如下,方法体略
    public User setId(Long id) {}
    public User setName(String name) {}
}
  1. prefix的中文含义是前缀,用于生成getter和setter方法的字段名会忽视指定前缀(遵守驼峰命名)
@Data
@Accessors(prefix = "p")
class User {
	private Long pId;
	private String pName;
	
	// 生成的getter和setter方法如下,方法体略
	public Long getId() {}
	public void setId(Long id) {}
	public String getName() {}
	public void setName(String name) {}
}

2. lombok @EqualsAndHashCode和@Data

在使用@Data时同时加上@EqualsAndHashCode(callSuper=true)注解。(开发一般都会同时加上这两个注解)

源码里callSuper默认值就是false,所以说我们代码里面写这一行是多余的。
callSuper = true时,子类在重写hashcode()和equals()方法时才会调用父类的属性,即把父类属性包含在一起重写hashcode()和equals()方法。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Page {

    /**
     * 当前页
     */
    private Integer current = 1;

    /**
     * 每页数量
     */
    private Integer size = 10;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User extends Page {

    private Integer id;

    private String name;

    public User(Integer current, Integer size, Integer id, String name) {
        super(current, size);
        this.id = id;
        this.name = name;
    }
}
public class Test {

    public static void main(String[] args) {
        User user1 = new User(1, 10, 1, "张三");
        User user2 = new User(2, 10, 1, "张三");
        boolean flag = user1.equals(user2);
        System.out.println("flag = " + flag);
    }
}

@EqualsAndHashCode(callSuper = false)时,运行结果:

flag = true

奇怪不,明明属性值不一样,但equal()比较时竟然相等。

@EqualsAndHashCode(callSuper = true)时,运行结果:

flag = false

3.mybatisPlus @TableName(“t_user”)

注解声明数据库对应的表名

4. mybatisPlus @TableId(value = “id”, type = IdType.ASSIGN_ID)

用来注解数据库中主键对应的字段
1,ASSIGN_ID(雪花算法)
如果不设置类型值,默认则使用IdType.ASSIGN_ID策略(自3.3.0起)。该策略会使用雪花算法自动生成主键ID,主键类型为长或字符串(分别对应的MySQL的表字段为BIGINT和VARCHAR)
2,ASSIGN_UUID(不含中划线的UUID)
如果使用 IdType.ASSIGN_UUID 策略,则会自动生成不含中划线的 UUID 作为主键。主键类型为 String,对应 MySQL 的表字段为 VARCHAR(32)
3,AUTO(数据库 ID 自增)
对于像 MySQL 这样的支持主键自动递增的数据库,我们可以使用 IdType.AUTO 策略。
4,INPUT(insert 前自行 set 主键值)
(1)针对有序列的数据库:比如 Oracle,SQLServer 等,当需要建立一个自增字段时,需要用到 sequence。

提示: 在 Oracle 11g 中,设置自增字段,需要先创建序列(SQUENCE)再创建一个触发器(TRIGGER)。 在 Oracle
12c 中,只需要使用 IDENTITY 属性就可以了,和 MySQL 一样简单。

(2)Mybatis-Plus 已经定义好了常见的数据库主键序列,我们首先只需要在 @Configuration 类中定义好 @Bean:

Mybatis-Plus 内置了如下数据库主键序列(如果内置支持不满足你的需求,可实现 IKeyGenerator 接口来进行扩展):
DB2KeyGenerator
H2KeyGenerator
KingbaseKeyGenerator
OracleKeyGenerator
PostgreKeyGenerator

@Bean
public OracleKeyGenerator oracleKeyGenerator(){
    return new OracleKeyGenerator();
}

(3)然后实体类配置主键 Sequence,指定主键策略为 IdType.INPUT 即可:

提示:支持父类定义 @KeySequence 子类使用,这样就可以几个表共用一个 Sequence

@TableName("TEST_SEQUSER")
@KeySequence("SEQ_TEST")//类注解
public class TestSequser{
  @TableId(value = "ID", type = IdType.INPUT)
  private Long id;
 
}

(4)如果主键是 String 类型的,也可以使用:
如何使用 Sequence 作为主键,但是实体主键类型是 String 也就是说,表的主键是 varchar2,但是需要从 sequence 中取值
实体定义 @KeySequence 注解 clazz 指定类型 String.class
实体定义主键的类型 String

注意:oracle 的 sequence 返回的是 Long 类型,如果主键类型是 Integer,可能会引起
ClassCastException

@KeySequence(value = "SEQ_ORACLE_STRING_KEY", clazz = String.class)
public class YourEntity{
     
    @TableId(value = "ID_STR", type = IdType.INPUT)
    private String idStr;
    ...
}

5,NONE(无状态)
如果使用 IdType.NONE 策略,表示未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
附:全局策略配置
假设我们希望默认全部都使用 AUTO 策略(数据库 ID 自增),那么可以在 application.properties 中添加如下配置进行修改:

mybatis-plus.global-config.db-config.id-type=auto

5. mybatisPlus @TableField(“username”)

声明对应的数据库字段,其中@TableField(exist => false)是声明数据库中不存在的字段,用于传递除数据库字段以外的字段,比如文件名等,用来适配前端UI表现层,添加数据库不存在字段相当于对实体类字段的扩充,用来代替DTO是不错的选择