我們?cè)趯?shí)際開(kāi)發(fā)中往數(shù)據(jù)庫(kù)中存放數(shù)據(jù)的時(shí)候會(huì)有一些默認(rèn)值叽掘,比如創(chuàng)建時(shí)間飒货,更新時(shí)間之類(lèi)的,這里給大家安利兩種方法
1,如果使用的是創(chuàng)建時(shí)間和更新時(shí)間這種字段我們可以使用數(shù)據(jù)庫(kù)的工具操作
數(shù)據(jù)庫(kù)中勾選這個(gè)在你每次更新數(shù)據(jù)庫(kù)中這個(gè)表的字段的時(shí)候都會(huì)獲取當(dāng)前的時(shí)間做為這個(gè)字段的值谎柄,CURRENT_TIMESTAMP:將默認(rèn)值設(shè)置為這個(gè)參數(shù)則會(huì)在創(chuàng)建的時(shí)候獲取當(dāng)前時(shí)間作為這個(gè)參數(shù)的值,這是基于數(shù)據(jù)庫(kù)完成對(duì)這些字段的維護(hù)操作惯雳,適用于簡(jiǎn)單的可以直接拿到值,不需要從請(qǐng)求獲取參數(shù)的場(chǎng)景鸿摇,如果是我在創(chuàng)建對(duì)象的時(shí)候需要記錄創(chuàng)建對(duì)象的人是誰(shuí)石景,更新的時(shí)候需要知道更新的人是誰(shuí),這種方法就沒(méi)有辦法滿(mǎn)足了
2拙吉,基于mybatis-plus的注解的方式完成新建和更改的時(shí)候給參數(shù)賦值
2.1簡(jiǎn)單的賦值潮孽,如1中所說(shuō)的給創(chuàng)建時(shí)間,更改時(shí)間賦值
/**
* 創(chuàng)建時(shí)間
*/
@TableField(value = "create_time",fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新時(shí)間
*/
@TableField(value = "modify_time",fill = FieldFill.INSERT_UPDATE)
private LocalDateTime modifyTime;
這里我們使用create_time和modify_time字段表示創(chuàng)建時(shí)間和更新時(shí)間筷黔,我們?cè)诩由蟃ableField的fill 屬性的時(shí)候就是說(shuō)當(dāng)前這個(gè)字段的字段填充策略是什么
public enum FieldFill {
/**
* 默認(rèn)不處理
*/
DEFAULT,
/**
* 插入時(shí)填充字段
*/
INSERT,
/**
* 更新時(shí)填充字段
*/
UPDATE,
/**
* 插入和更新時(shí)填充字段
*/
INSERT_UPDATE
}
這就是fill 的枚舉往史,我們?cè)趯?shí)體類(lèi)中添加了注解之后再寫(xiě)個(gè)類(lèi)來(lái)實(shí)現(xiàn)MetaObjectHandler
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "modifyTime", LocalDateTime.class, LocalDateTime.now());
}
}
這里的兩個(gè)方法就是新建和更新的時(shí)候執(zhí)行的方法,如果在實(shí)體類(lèi)中有使用了FieldFill.INSERT或者FieldFill.INSERT_UPDATE的屬性就會(huì)執(zhí)行這兩個(gè)方法 strictInsertFill的方法就會(huì)把當(dāng)前的時(shí)間賦值給createTime(這里如果是modifyTime這個(gè)字段不存在則不會(huì)跟新:注意這里的字段是使用的我們實(shí)體類(lèi)中的字段而不是數(shù)據(jù)庫(kù)中的字段)
2.2當(dāng)我們賦值之后就不需要通過(guò)這個(gè)方式賦值佛舱,如果我們沒(méi)有設(shè)置值則自動(dòng)來(lái)設(shè)置值
我們只需要在上面這個(gè)方法中獲取你參數(shù)的值的時(shí)候使用Object createTime1 = getFieldValByName("createTime", metaObject);
方法來(lái)獲取是否賦值給這個(gè)參數(shù)
@Override
public void insertFill(MetaObject metaObject) {
//判斷添加/更新的時(shí)候是否給他賦值
Object createTime1 = getFieldValByName("createTime", metaObject);
if (createTime1 != null) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
}
}
@Override
public void updateFill(MetaObject metaObject) {
//判斷添加/更新的時(shí)候是否給他賦值
Object modifyTime1 = getFieldValByName("modifyTime", metaObject);
if (modifyTime1 != null) {
this.strictUpdateFill(metaObject, "modifyTime", LocalDateTime.class, LocalDateTime.now());
2.3當(dāng)我們賦值的參數(shù)的值需要從請(qǐng)求中獲取值的時(shí)候(比如我更新的時(shí)候需要設(shè)置更新用戶(hù)的值)
@Component
public class MyMetaObjectHandler extends HttpFilter implements MetaObjectHandler {
private HttpServletRequest request;
@Override
public void insertFill(MetaObject metaObject) {
//判斷添加/更新的時(shí)候是否給他賦值
Object createTime1 = getFieldValByName("createTime", metaObject);
if (createTime1 != null) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
}
}
@Override
public void updateFill(MetaObject metaObject) {
//判斷添加/更新的時(shí)候是否給他賦值
Object modifyTime1 = getFieldValByName("modifyTime", metaObject);
if (modifyTime1 != null) {
this.strictUpdateFill(metaObject, "modifyTime", LocalDateTime.class, LocalDateTime.now());
}
String userId = request.getHeader(HeaderConstant.USER_ID);
this.strictUpdateFill(metaObject, "userId", Long.class, userId);
}
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
this.request = request;
chain.doFilter(request, response);
}
}
我們通過(guò)HttpFilter 去獲取請(qǐng)求頭中的參數(shù)然后賦值給我們更新的時(shí)候的參數(shù)椎例,最后在更新數(shù)據(jù)庫(kù)中的字段的時(shí)候就會(huì)更新這個(gè)字段的值
以上就是我對(duì)于字段填充功能的方法的總結(jié),如有疑問(wèn)或者更好的建議可以聯(lián)系我-请祖。-订歪!
ps:發(fā)現(xiàn)上面的寫(xiě)法會(huì)出現(xiàn)失敗的情況,后來(lái)查詢(xún)是因?yàn)檫^(guò)濾器在并發(fā)情況下有可能拿不到對(duì)應(yīng)的值所以換了一個(gè)方法(實(shí)現(xiàn)思想一樣)
/**
* 新增的時(shí)候添加字段
*
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
ServletRequestAttributes servletRequestAttributes = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes());
if (null != servletRequestAttributes) {
String userId = servletRequestAttributes.getRequest().getHeader(HeaderConstant.USER_ID);
String departmentId = servletRequestAttributes.getRequest().getHeader(HeaderConstant.DEPARTMENT_ID);
log.error("userId=[{}],時(shí)間為[{}]", userId, LocalDateTime.now());
if (StringUtils.isNotBlank(userId)) {
this.strictInsertFill(metaObject, "createUid", Long.class, Long.valueOf(userId));
log.error("userId=[{}],時(shí)間為[{}]", Long.valueOf(userId), LocalDateTime.now());
}
if (StringUtils.isNotBlank(departmentId)) {
this.strictInsertFill(metaObject, "createDepartmentId", Long.class, Long.valueOf(departmentId));
}
}
}