如何實(shí)現(xiàn)后端開發(fā)框架(七)-自動(dòng)填充字段
1. 問題描述
一般系統(tǒng)的數(shù)據(jù)上都需要記錄創(chuàng)建人留晚,修改人嗅绸,創(chuàng)建時(shí)間唉俗,修改時(shí)間等額外信息,這些額外信息會(huì)用于數(shù)據(jù)權(quán)限處理或者業(yè)務(wù)責(zé)任標(biāo)記剥懒,那么能不能在框架層面上來統(tǒng)一記錄這些字段信息呢?
2. 實(shí)現(xiàn)思路
Mybatis-Plus提供了一個(gè)自動(dòng)填充字段的功能合敦,我們就利用這個(gè)功能來實(shí)現(xiàn)對(duì)系統(tǒng)中通用字段的填充處理初橘。
Mybatis-Plus的功能說明文檔見:https://baomidou.com/guides/auto-fill-field/
3. 實(shí)現(xiàn)步驟
3.1 實(shí)體基類處理
往實(shí)體基類上添加通用字段,同時(shí)數(shù)據(jù)庫中的每張數(shù)據(jù)表上都需要添加這些字段充岛。
@Data
@EqualsAndHashCode()
public class MyBaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "ID")
protected String id;
/** 創(chuàng)建用戶 */
@TableField(value = "CREATE_USER", fill = FieldFill.INSERT)
protected String createUser;
/** 創(chuàng)建時(shí)間 */
@TableField(value = "CREATE_TIME", fill = FieldFill.INSERT)
protected Date createTime;
/** 修改用戶 */
@TableField(value = "UPDATE_USER", fill = FieldFill.INSERT_UPDATE)
protected String updateUser;
/** 修改時(shí)間 */
@TableField(value = "UPDATE_TIME", fill = FieldFill.INSERT_UPDATE)
protected Date updateTime;
@TableField(exist = false)
protected long pageSize;
@TableField(exist = false)
protected long currentPage;
}
3.2 通用字段處理
對(duì)通用字段設(shè)置填充規(guī)則保檐。
注意:
- 實(shí)際使用時(shí)填充信息要改為當(dāng)前登錄用戶的相關(guān)信息。
- Mybatis-Plus默認(rèn)填充策略為如果屬性有值則不覆蓋崔梗,現(xiàn)在改為每次都覆蓋更新夜只。
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
private static final Logger logger = LoggerFactory.getLogger(MyMetaObjectHandler.class);
@Override
/** 創(chuàng)建記錄時(shí)還需要同時(shí)修改更新相關(guān)的字段信息 */
public void insertFill(MetaObject metaObject) {
logger.debug("start insert fill ....");
// 注意這里的fieldName是實(shí)體字段名稱,而不是數(shù)據(jù)庫字段名稱蒜魄!
this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
// 以下為測試數(shù)據(jù)扔亥,實(shí)際使用時(shí)要改為當(dāng)前登錄用戶信息
this.strictInsertFill(metaObject, "createUser", String.class, "randy");
this.strictInsertFill(metaObject, "updateUser", String.class, "randy");
}
@Override
public void updateFill(MetaObject metaObject) {
logger.debug("start update fill ....");
this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
// 以下為測試數(shù)據(jù),實(shí)際使用時(shí)要改為當(dāng)前登錄用戶信息
this.strictInsertFill(metaObject, "updateUser", String.class, "leon");
}
/**
* 默認(rèn)填充策略為如果屬性有值則不覆蓋,現(xiàn)在改為每次都覆蓋更新
*
* @param metaObject
* @param fieldName
* @param fieldVal
* @return
*/
@Override
public MetaObjectHandler fillStrategy(MetaObject metaObject, String fieldName, Object fieldVal) {
setFieldValByName(fieldName, fieldVal, metaObject);
return this;
}
}
4. 測試代碼
只要使用Mybatis-Plus的新增谈为,修改API來操作數(shù)據(jù)庫旅挤,那么就會(huì)根據(jù)自動(dòng)填充規(guī)則來設(shè)置數(shù)據(jù)庫表中通用字段的值。
@RestController
@RequestMapping("/test/user")
public class UserController extends MyBaseController<UserService, User> {
/**
* 創(chuàng)建用戶信息
*
* @param user
* @return
*/
@PostMapping(value = "/create")
public boolean create(@RequestBody User user) {
return myBaseService.save(user);
}
/**
* 修改用戶信息
*
* @param user
* @return
*/
@PostMapping(value = "/update")
public boolean update(@RequestBody User user) {
return myBaseService.updateById(user);
}
}
5. 完整代碼
完整代碼見以下Git倉庫中的"autofill-field"子項(xiàng)目: