MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了大量的常用注解,使得开发者能够更方便地进行数据库操作。
MyBatis-Plus 提供的注解可以帮我们解决一些数据库与实体之间相互映射的问题。
@TableName
@TableName
用来指定表名
在使用 MyBatis-Plus 实现基本的 CRUD 时,我们并没有指定要操作的表,只是在 Mapper 接口继承 BaseMapper 时,设置了泛型 User,而操作的表为 user 表。
MyBatis-Plus 在确定操作的表时,由 BaseMapper 的泛型决定,即实体类型决定,且默认操作的表名和实体类型的类名一致。
若实体类类型的类名和要操作的表的表名不一致,如引入的泛型为 User,需要操作的表名为 t_user,程序会抛出异常,Table 'mybatis_plus.user' doesn't exist
。
这种问题有两种解决方案:
@TableName 注解
在实体类类型上添加注解 @TableName("t_user")
,标识实体类对应的表,即可成功执行 SQL 语句
@Data
@TableName("t_user")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
全局配置
在开发的过程中,我们经常遇到以上的问题,即实体类所对应的表都有固定的前缀,例如 t_
或 tbl_
此时,可以使用 MyBatis-Plus 提供的全局配置,为实体类所对应的表名设置默认的前缀,那么就不需要在每个实体类上通过 @TableName
标识实体类对应的表
mybatis-plus:
global-config:
db-config:
# 设置实体类所对应的表的统一前缀
table-prefix: t_
@TableId
@Tableld
用来指定表中的主键字段信息
MyBatis-Plus 在实现CRUD时,会默认将实体类名为 id 的属性作为主键列,并在插入数据时,默认基于雪花算法的策略生成 id
若实体类和表中表示主键的不是 id,而是其他字段,例如 uid,程序抛出异常,Field ‘uid’ doesn’t have a default value,MyBatis-Plus 不会将 uid
作为主键赋值
为解决这种问题,可以在实体类中需要设定为主键的属性上通过 @TableId
将其标识为主键,即可成功执行 SQL 语句
@Date
public class User {
@TableId
private Long uid;
private String name;
private Integer age;
private String email;
}
@TableId 的 value 属性
若实体类中主键对应的属性为 id,而表中表示主键的字段为 uid,此时若只在属性 id 上添加注解 @TableId
,则抛出异常 Unknown column 'id' in 'field list'
,即 MyBatis-Plus 仍然会将 id 作为表的主键操作,而表中表示主键的是字段 uid 。此时需要通过 @TableId
注解的 value
属性,指定表中的主键字段,@TableId("uid")
或 @TableId(value="uid")
@TableId的type属性
type
属性用来定义主键策略:默认为雪花算法
常用的主键策略:
值 | 描述 |
---|---|
IdType.ASSIGN_ID(默认) | 基于雪花算法的策略生成数据id,与数据库id是否设置自增无关 |
IdType.AUTO | 使用数据库的自增策略,该类型请确保数据库设置了id自增, |
IdType.INPUT | 自行通过 set 方法输入 id,为主键赋值 |
- IdType.ASSIGN_ID通过接口
ldentifierGenerator
的方法nextld
来生成 id 默认实现类为DefaultldentifierGenerator
雪花算法。Long 型整数,长度为20
@Data
public class User {
@TableId(value = "uid", type = IdType.AUTO) // 假设数据库表的主键字段为 uid,并且是自增的
private Long uid;
private String name;
private Integer age;
private String email;
// 其他字段...
}
配置全局主键策略:
#MyBatis-Plus相关配置
mybatis-plus:
configuration:
#配置日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
#配置mp的主键策略为自增
id-type: auto
# 设置实体类所对应的表的统一前缀
table-prefix: t_
@TbaleField
@TableField
用来指定表中的普通字段信息
MyBatis-Plus 在执行SQL语句时,要保证实体类中的属性名和表中的字段名一致
如果实体类中的属性名和字段名不一致的情况:
-
若实体类中的属性使用的是驼峰命名风格,而表中的字段使用的是下划线命名风格:例如实体类属性
userName
,表中字段user_name
,此时 MyBatis-Plus 会自动将下划线命名风格转化为驼峰命名风格 -
若实体类中的属性和表中的字段不满足情况:例如实体类属性
name
,表中字段username
。此时需要在实体类属性上使用@TableField("username")
设置属性所对应的字段名
public class User {
@TableId("uid")
private Long id;
@TableField("username")
private String name;
private Integer age;
private String email;
}
成员变量名以 is
开头,且是布尔值,Mybatis Plus 在底层会基于反射类型的机制获取字段名称,在这种情况下,经过反射处理,会将 is 去掉,剩余的部分驼峰转下划线作为字段名。
此时需要在实体类属性上使用 @TableField("is_married")
设置属性所对应的字段名
public class User {
@TableId("uid")
private Long id;
@TableField("username")
private String name;
@TableField("is_married")
private Boolean isMarried;
private String email;
}
当成员变量名与数据库关键字冲突时,此时需要在实体类属性上使用 @TableField
添加转义字符并设置属性所对应的字段名
public class User {
@TableId("uid")
private Long id;
@TableField("username")
private String name;
@TableField("is_married")
private Boolean isMarried;
@TableField("`order`")
private Integer order;
}
成员变量不是数据库字段,即不需要被获取为字段,此时需要在实体类属性上使用 @TableField
,并设置 exist
属性为 false,标记其不为数据库字段
public class User {
@TableId("uid")
private Long id;
@TableField("username")
private String name;
@TableField("is_married")
private Boolean isMarried;
@TableField("`order`")
private Integer order;
@TableField(exist=false)
private String address;
}
@TableLogic
@TableLogic
用于逻辑删除,可以进行数据恢复
-
物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除的数据
-
逻辑删除:指在数据库中不直接删除数据,而是“假删除”,将对应数据通过设置一个是否被删除字段的标志位,修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录
使用 @TableLogic 注解可以声明一个逻辑删除字段,它可以是一个 boolean 类型或者一个标识删除状态的数字。
当执行删除操作时,Mybatisplus 会自动更新这个字段的值来表示数据的删除状态。在查询数据时,Mybatisplus 会自动过滤掉被标记为删除状态的数据。这种方式相比物理删除可以更好地保留数据的完整性并且方便数据的恢复。
@Data
public class User {
private Long id;
private String username;
private Integer age;
@TableLogic
private Integer deleted;
}
总结
MyBatis-Plus通过提供这些常用注解和全局配置,使得我们能够更加方便地进行数据库操作,提高开发效率。在实际开发中,熟练掌握这些注解的用法,将有助于提高代码的质量和可维护性。