MyBatisPlus中使用@TableField完成字段自动填充

在项目中,我们有一些公共的字段需要做修改
如:
gmt_create:创建时间
creator_id:创建人
gmt_modified:修改时间
modifier_id:修改人
这时候我们可以采用 MyBatis-Plus 中的字段自动填充功能去实现
思路:抽取公用字段封装到BaseEntity类中,再将使用到此公共字段的类继承基类,最后由 MyBatis-Plus 帮我们实现自动填充,这样我们便可以在service服务类中减少一定代码重复量!

一.

场景
官方文档:

字段注解 @TableField

com.baomidou.mybatisplus.annotations.TableField

描述
value 字段值(驼峰命名方式,该值可无)
update 预处理 set 字段自定义注入
condition 预处理 WHERE 实体条件自定义运算规则
el 详看注释说明
exist 是否为数据库表字段( 默认 true 存在,false 不存在 )
strategy 字段验证 ( 默认 非 null 判断,查看 com.baomidou.mybatisplus.enums.FieldStrategy )
fill 字段填充标记 ( FieldFill, 配合自动填充使用 )

字段填充策略 FieldFill

描述
DEFAULT 默认不处理
INSERT 插入填充字段
UPDATE 更新填充字段
INSERT_UPDATE 插入和更新填充字段
实现
实体类中有如下属性,通过上面的自动填充属性,我们可以实现

在进行插入操作时对

添加了注解@TableField(fill = FieldFill.INSERT)

的字段进行自动填充。

对添加了注解@TableField(fill = FieldFill.INSERT_UPDATE)

的字段在进行插入和更新时进行自动填充。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
private Long creatorId;

/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date gmtCreat;

/**
* 修改人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long modifierId;

/**
* 修改时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date gmtModified;

/**
* 是否可用
*/
@TableField(fill = FieldFill.INSERT)
private Boolean availableFlag;

这样我们在具体业务中对实体类进行赋值就可以不用对这些公共字段进行赋值,在执行插入或者更新时就能自动赋值并插入数据库。

那么要自动赋的值在哪里配置?

在项目的config包下新建自动填充处理类使其实现接口MetaObjectHandler

并重写其方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

package com.ws.api.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
* 自动填充处理类
* @author badao
* @version 1.0
* @see
**/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {


@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("modifierId", new Long(111), metaObject);
this.setFieldValByName("gmtModified", new Date(), metaObject);
this.setFieldValByName("creatorId", new Long(111), metaObject);
this.setFieldValByName("gmtCreat",new Date(), metaObject);
this.setFieldValByName("availableFlag",true, metaObject);


}

@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("modifierId", new Long(111), metaObject);
this.setFieldValByName("gmtModified", new Date(), metaObject);
}
}

其中方法参数中第一个是前面自动填充所对应的字段,第二个是要自动填充的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package com.meiyuan.catering.admin.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.meiyuan.catering.admin.entity.CateringAdmin;
import com.meiyuan.catering.admin.enums.base.DelEnum;
import com.meiyuan.catering.core.util.HttpContextUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
* 公共字段,自动填充值
* @author admin
*/
@Slf4j
@Component
public class FieldMetaObjectHandler implements MetaObjectHandler {
private final static String CREATE_DATE = "createTime";
private final static String CREATOR = "createBy";
private final static String UPDATE_DATE = "updateTime";
private final static String UPDATER = "updateBy";
private final static String DEL_FLAG = "del";
private final static String MERCHANT_ID = "merchantId";
private final static String CONTEXT_PATH = "/manage";
private Long merchantId;

@Value("${goods.merchant.id}")
public void setMerchantId(Long id) {
this.merchantId = id;
}

@Override
public void insertFill(MetaObject metaObject) {
LocalDateTime now = LocalDateTime.now();
//创建时间
setInsertFieldValByName(CREATE_DATE, now, metaObject);
//更新时间
setInsertFieldValByName(UPDATE_DATE, now, metaObject);
//删除标识
setInsertFieldValByName(DEL_FLAG, DelEnum.NOT_DELETE.getFlag(), metaObject);
String contextPath = Strings.EMPTY;
if (HttpContextUtils.getHttpServletRequest() != null) {
contextPath = HttpContextUtils.getHttpServletRequest().getContextPath();
}
// 后台请求
if (CONTEXT_PATH.equals(contextPath)) {
Object info = HttpContextUtils.getHttpServletRequest().getAttribute("info");
if (info != null) {
CateringAdmin admin = (CateringAdmin) info;
setInsertFieldValByName(CREATOR, admin.getId(), metaObject);
setInsertFieldValByName(UPDATER, admin.getId(), metaObject);
setInsertFieldValByName(MERCHANT_ID, merchantId, metaObject);
}
}

}

@Override
public void updateFill(MetaObject metaObject) {
//更新时间
setUpdateFieldValByName(UPDATE_DATE, LocalDateTime.now(), metaObject);
String contextPath = Strings.EMPTY;
if (HttpContextUtils.getHttpServletRequest() != null) {
contextPath = HttpContextUtils.getHttpServletRequest().getContextPath();
}
// 后台请求
if (CONTEXT_PATH.equals(contextPath)) {
Object info = HttpContextUtils.getHttpServletRequest().getAttribute("info");
if (info != null) {
CateringAdmin admin = (CateringAdmin) info;
setUpdateFieldValByName(UPDATER, admin.getId(), metaObject);
}

}
}

}

From

评论

:D 一言句子获取中...