版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址:https://blog.csdn.net/sun8112133/article/details/106917113
文章目录
本篇博客主要讲解 MyBatis Plus 框架中常用注解的使用。
一、@TableName
此注解是用来 映射数据库的表名。当表名与实体类名不相同时,需要加此注解来进行映射;相同时则不需要加此注解。
@Data
@TableName("t_user")
// 数据表的表名叫 t_user,要与实体类 User 进行映射
public class User {
private Integer id;
private String name;
private Integer age;
}
二、@TableId
此注解是用来 映射数据库的主键。还可以设置该主键的生成策略。
1、常用属性
- value: 映射主键字段名。当属性名和字段名相同时不需要此属性;
- type: 设置主键类型,也就是主键的生成策略。
2、type 属性值
- AUTO(0): 数据库自增。不管开发者赋不赋值,都会采用自增的方式;
- NONE(1): 默认值。它会随机产生一个随机数,这个产生方式使用雪花算法来实现;
- INPUT(2): 需要开发者手动赋值。若开发者没有赋值(null),数据库默认会以自增的方式给主键赋值;若开发者手动赋值,则会存入该值;
- ASSIGN_ID(3): MP 会自动产生主键值。这个产生方式采用雪花算法来实现,主键类型可以是 Long、Integer、String,使用效果类似 NONE;
- ASSIGN_UUID(4): MP 会自动产生一个 UUID 值。主键类型必须是 String 类型。
3、小例子
@Data
@TableName("t_user")
public class User {
@TableId(type=IdType.ASSIGN_UUID)
private String id; // 会自动产生一个 UUID 值
private String name;
private Integer age;
}
三、@TableField
此注解是用来 映射数据库的非主键字段。
1、常用属性
- value: 映射非主键字段名。当属性名和字段名相同时不需要此属性;
- exist: 表示该属性是否为数据库字段。它有两个值:true 为是;false 为不是,就不会从数据库中查询此字段。这个属性一般在 VO 类或 DTO 类中用的比较多。如果实体类中的成员变量在数据库中没有对应的字段,则可以使用;
- select: 表示该属性在查询的时候是否从数据库中查询该字段;
- fill: 表示是否自动填充,将对象存入数据库的时候,由 MyBatis Plus 自动给某些字段赋值,比如:create_time、update_time 这一类字段就会用到此属性。
2、小例子(创建时间与更新时间)
1)添加字段
给数据表添加
create_time
、update_time
字段。
create table `t_user` (
`id` int(11) not null auto_increment,
`name` varchar(255),
`age` int(11),
`create_time` datetime, -- 创建时间
`update_time` datetime, -- 更新时间
primary key (`id`)
);
2)实体类中添加成员变量
给实体类中添加
createTime
和updateTime
成员变量,并且添加@TableField
注解,设置动作属性(fill)。FieldFill 这个类是描述它的一个动作,在什么时期去插入的。
@Data
@TableName("t_user")
public class User {
@TableId(type=IdType.ASSIGN_UUID)
private String id; // 会自动产生一个 UUID 值
private String name;
private Integer age;
// MyBatis Plus 会自动对驼峰命名和下划线命名做一个映射
// 当添加的时候去插入
@TableField(fill = FieldFill.INSERT)
private Date createTime;
// 当添加或更新的时候去插入
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
3)创建自动填充的处理器
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
// 当插入的时候填充数据
// metaObject 是当前传来的对象
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
// 当更新的时候填充数据
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
四、@Version
该注解是用来 标记乐观锁 的,所谓 乐观锁 就是来保证数据安全性的。它是通过
version
字段来保证数据的安全性,当修改数据的时候,会以version
作为条件,当条件成立的时候才会修改成功。这是我给大家举个小例子,帮助大家快速了解这个注解:
1、添加字段
给数据表添加
version
字段,并设置默认值为1
。
create table `t_user` (
`id` int(11) not null auto_increment,
`name` varchar(255),
`age` int(11),
`create_time` datetime, -- 创建时间
`update_time` datetime, -- 更新时间
`version` int(11) default 1,
primary key (`id`)
);
2、实体类添加成员变量
给实体类中添加
version
成员变量,并且添加@Version
注解。
@Data
@TableName("t_user")
public class User {
@TableId(type=IdType.ASSIGN_UUID)
private String id; // 会自动产生一个 UUID 值
private String name;
private Integer age;
// MyBatis Plus 会自动对驼峰命名和下划线命名做一个映射
// 当添加的时候去插入
@TableField(fill = FieldFill.INSERT)
private Date createTime;
// 当添加或更新的时候去插入
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@Version
private Integer version;
}
3、注册配置类
@Configuration
public class MyBatisPlusConfig {
// 配置 启用乐观锁功能
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
五、@EnumValue
此注解是用来 映射实体类中的枚举类型。大家可能经常会遇到这样的情况,比如性别字段,在数据库中存储的时间一般不会存储
男
、女
这样的数据,有可能会存储0
或1
这样的数字代码,但是在页面中需要手动进行处理。我们可以通过该注解很方便的映射数据库中存储的数字代码,在页面中就直接显示对应的汉字了。在这里我就以性别为例,举一个简单的小例子,这里提供两种方式实现这个小例子:
- 枚举映射;
- 接口实现。
1、枚举映射
1)创建枚举类型
通过枚举类(
@EnumValue
)注解,将数据库字段映射成实体类的枚举类型成员变量。
public enum SexEnum {
MEN(1, "男"),
WOMEN(0, "女");
@EnumValue
private Integer code; // 映射数据库的中字段
private String msg;
private SexEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
}
2)添加字段
给数据表添加
sex
字段。
create table `t_user` (
`id` int(11) not null auto_increment,
`name` varchar(255),
`age` int(11),
`create_time` datetime, -- 创建时间
`update_time` datetime, -- 更新时间
`version` int(11) default 1,
`sex` int(11),
primary key (`id`)
);
3)实体类中添加成员变量
@Data
@TableName("t_user")
public class User {
@TableId(type=IdType.ASSIGN_UUID)
private String id; // 会自动产生一个 UUID 值
private String name;
private Integer age;
// MyBatis Plus 会自动对驼峰命名和下划线命名做一个映射
// 当添加的时候去插入
@TableField(fill = FieldFill.INSERT)
private Date createTime;
// 当添加或更新的时候去插入
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@Version
private Integer version;
private SexEnum sex;
}
4)配置枚举包
在
application.yml
配置文件中设置扫描枚举类所在的包。
mybatis-plus:
type-enums-package:
com.demo.enums
2、接口实现
1)创建枚举类型
public enum SexEnum implements IEnum<Integer> {
MEN(1, "男"),
WOMEN(0, "女");
private Integer code;
private String msg;
private SexEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
@Override
public Integer getValue() {
return this.code;
}
}
2)配置枚举包
在
application.yml
配置文件中设置扫描枚举类所在的包。
mybatis-plus:
type-enums-package:
com.demo.enums
六、@TableLogic
此注解是用来 映射逻辑删除字段。
注意: 如果不加
@TableLogic
注解,MP 真的会将那条数据删除哦~
1、添加字段
给数据表添加
deleted
字段,并设置默认值为0
。
create table `t_user` (
`id` int(11) not null auto_increment,
`name` varchar(255),
`age` int(11),
`create_time` datetime, -- 创建时间
`update_time` datetime, -- 更新时间
`version` int(11) default 1,
`sex` int(11),
`deleted` int(11) default 0,
primary key (`id`)
);
2、实体类中添加成员变量
@Data
@TableName("t_user")
public class User {
@TableId(type=IdType.ASSIGN_UUID)
private String id; // 会自动产生一个 UUID 值
private String name;
private Integer age;
// MyBatis Plus 会自动对驼峰命名和下划线做一个映射
// 当添加的时候去插入
@TableField(fill = FieldFill.INSERT)
private Date createTime;
// 当添加或更新的时候去插入
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@Version
private Integer version;
private SexEnum sex;
@TableLogic
private Integer deleted; // 与数据库中的 deleted 字段进行映射
}
3、配置逻辑删除
mybatis-plus:
global-config:
db-config: # 配置 0 是未删除,1 是已删除
logic-not-delete-value: 0
logic-delete-value: 1