如何实现后端开发框架(七)-自动填充字段
如何实现后端开发框架(七)-自动填充字段
1.问题描述
一般系统的数据上都需要记录创建人,修改人,创建时间,修改时间等额外信息,这些额外信息会用于数据权限处理或者业务责任标记,那么能不能在框架层面上来统一记录这些字段信息呢?
2.实现思路
Mybatis-Plus提供了一个自动填充字段的功能,我们就利用这个功能来实现对系统中通用字段的填充处理。
Mybatis-Plus的功能说明文档见:https://baomidou.com/guides/auto-fill-field/
3.实现步骤
3.1.实体基类处理
往实体基类上添加通用字段,同时数据库中的每张数据表上都需要添加这些字段。
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
@Data
@EqualsAndHashCode()
public class MyBaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "ID")
protected String id;
/** 创建用户 */
@TableField(value = "CREATE_USER", fill = FieldFill.INSERT)
protected String createUser;
/** 创建时间 */
@TableField(value = "CREATE_TIME", fill = FieldFill.INSERT)
protected Date createTime;
/** 修改用户 */
@TableField(value = "UPDATE_USER", fill = FieldFill.INSERT_UPDATE)
protected String updateUser;
/** 修改时间 */
@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.通用字段处理
对通用字段设置填充规则。
注意:
- 实际使用时填充信息要改为当前登录用户的相关信息。
- Mybatis-Plus默认填充策略为如果属性有值则不覆盖,现在改为每次都覆盖更新。
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
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
private static final Logger logger = LoggerFactory.getLogger(MyMetaObjectHandler.class);
@Override
/** 创建记录时还需要同时修改更新相关的字段信息 */
public void insertFill(MetaObject metaObject) {
logger.debug("start insert fill ....");
// 注意这里的fieldName是实体字段名称,而不是数据库字段名称!
this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
// 以下为测试数据,实际使用时要改为当前登录用户信息
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());
// 以下为测试数据,实际使用时要改为当前登录用户信息
this.strictInsertFill(metaObject, "updateUser", String.class, "leon");
}
/**
* 默认填充策略为如果属性有值则不覆盖,现在改为每次都覆盖更新
*
* @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来操作数据库,那么就会根据自动填充规则来设置数据库表中通用字段的值。
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
@RestController
@RequestMapping("/test/user")
public class UserController extends MyBaseController<UserService, User> {
/**
* 创建用户信息
*
* @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”子项目:
https://github.com/randy0098/framework-samples
本文由作者按照
CC BY 4.0
进行授权