【MyBatisPlus笔记整理二】常用注解

版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址: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_timeupdate_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)实体类中添加成员变量

给实体类中添加 createTimeupdateTime 成员变量,并且添加 @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

此注解是用来 映射实体类中的枚举类型。大家可能经常会遇到这样的情况,比如性别字段,在数据库中存储的时间一般不会存储 这样的数据,有可能会存储 01 这样的数字代码,但是在页面中需要手动进行处理。我们可以通过该注解很方便的映射数据库中存储的数字代码,在页面中就直接显示对应的汉字了。

在这里我就以性别为例,举一个简单的小例子,这里提供两种方式实现这个小例子:

  1. 枚举映射;
  2. 接口实现。

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


博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!



猜你喜欢

转载自blog.csdn.net/sun8112133/article/details/106917113