目录
根据阿里巴巴编程规范中,数据库表中应该都有四个字段
- id -----------------------> 主键
- is_deleted-----------------------> 逻辑删除
- gmt_create-----------------------> 创建时间
- gmt_modified-----------------------> 更新时间
Mybatis-Plus中通过 注解 加 配置类 方式快速实现这件事。
1. 主键
常用几种id策略
在Mybatis-Plus中有这几种
public enum IdType {
AUTO(0),
NONE(1),
//用户输入ID 该类型可以通过自己注册自动填充插件进行填充
INPUT(2),
/* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
ID_WORKER(3),
UUID(4),
ID_WORKER_STR(5);
private int key;
private IdType(int key) {
this.key = key;
}
public int getKey() {
return this.key;
}
}
具体使用
@TableId(value = "id", type = IdType.ID_WORKER_STR)
private String id;
2. 逻辑删除
只需要在对应字段上加@TableLogic
@ApiModelProperty(value = "逻辑删除 1(true)已删除, 0(false)未删除")
@TableLogic
private Boolean isDeleted;
3. 时间自动填充
对应字段上添加@TableField注解
@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)
private Date gmtCreate;
@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date gmtModified;
实现元对象处理器接口
创建类 MyMetaObjectHandler 继承 MetaObjectHandler
注意加@Component
package com.atguigu.service_base.config.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
//属性名称,不是字段名称
this.setFieldValByName("gmtCreate", new Date(), metaObject);
this.setFieldValByName("gmtModified", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("gmtModified", new Date(), metaObject);
}
}
4. 添加version字段实现乐观锁
主要适用场景:
当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数
据更新
乐观锁实现方式:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
添加version字段并添加@Version注解
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
元对象处理器接口添加
version
的
insert
默认值
this.setFieldValByName("version", 1, metaObject);
package com.atguigu.service_base.config.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
//属性名称,不是字段名称
this.setFieldValByName("version", 1, metaObject);
this.setFieldValByName("gmtCreate", new Date(), metaObject);
this.setFieldValByName("gmtModified", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("gmtModified", new Date(), metaObject);
}
}
特别说明
:
- 支持的数据类型只有 int,Integer,long,Long,Date,Timestamp,LocalDateTime
- 整数类型下 newVersion = oldVersion + 1
- newVersion 会回写到 entity 中
- 仅支持 updateById(id) 与 update(entity, wrapper) 方法
- 在 update(entity, wrapper) 方法下, wrapper 不能复用!!!
最后添加乐观锁插件
@Bean
/**
* @description: 乐观锁插件
*/
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}