在项目中,我们有一些公共的字段需要做修改
如:
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;
@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;
@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