例:
@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方法的生成结果,下面介绍三个属性
- 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) {}
}
- 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) {}
}
- 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是不错的选择