写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!
今天介绍一下MP的自动填充功能,它是个什么玩意呢,之前用JPA的时候,像是创建时间、更新时间、创建人、更新人这些都可以自动设置,而不用自己设置,我想有些小伙伴也像我一样,在设置时间的时候可能会类似这样:setCreatedTime(new Date()),这篇就看一下MP的自动填充功能,以后再也不用自己设置时间了。
像上篇一样,写说下自动填充功能的使用步骤:
- t_user表增加字段created_time、updated_time、created_by、updated_by。
- User实体增加相应属性 并用@TableField(fill = FieldFill.INSERT)标记, FieldFill填充策略有四种:DEFAULT(默认不处理)、INSERT(插入时填充字段)、UPDATE(更新时填充字段)、INSERT_UPDATE(插入和更新时填充字段)。
- 实现MetaObjectHandler接口 重写insertFill、updateFill方法 方法中设置created_time、updated_time等的值。
User类中新增属性:
@Data
@TableName(value = "t_user")
public class User {
@TableId(value = "user_id",type = IdType.AUTO)
private Integer userId;
private String userName;
private Integer age;
private SexEnum sex;
@TableField(fill = FieldFill.INSERT)
private Date createdTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updatedTime;
@TableField(fill = FieldFill.INSERT)
private String createdBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updatedBy;
}
自定义实现类实现MetaObjectHandler接口:
先看下官网的示例:

如上,设置值的方法有很多写法,其中有一个setFieldValByName这个方法,也是唯一一个我能从名字看得懂这个方法作用的方法,毕竟英文能力有限,尴尬。。。
看下MyMetaObjectHandler类:
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.fillStrategy(metaObject, "createdTime", new Date());
this.setFieldValByName("updatedTime",new Date(),metaObject);
this.setFieldValByName("createdBy","admin",metaObject);
this.setFieldValByName("updatedBy","admin",metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.fillStrategy(metaObject, "updatedTime", new Date());
this.setFieldValByName("updatedBy","admin",metaObject);
}
}
新建AutoFillTest测试类测试下:
先看下insert:
@Test
public void aInsert(){
User user = new User();
user.setUserName("xiaohua");
user.setAge(18);
user.setSex(SexEnum.WOMAN);
userMapper.insert(user);
}
如上:我们只设置了姓名、年龄和性别,我们期望创建时间、更新时间、创建人、更新人这些能自动填充上,看下执行后数据库的结果:

已经自动填充上了我们想要的数据,再测试下更新操作,会不会为我们自动更新updated_time和updated_by字段值呢?测试方法如下:
@Test
public void bUpdate(){
User user = new User();
user.setUserId(11);
user.setAge(30);
userMapper.updateById(user);
}
看下执行结果:

完毕!
这里只是简单演示了一下自动填充功能比较常用的填充时间和操作人,实际用的时候肯定不是想我演示的这样将创建人和更新人写死在代码中,具体使用的时候改下就可以。
本文介绍 MyBatis Plus 的自动填充功能,包括如何配置实体类以实现自动填充,以及通过自定义 MetaObjectHandler 实现创建时间和更新时间等字段的自动设置。
1456

被折叠的 条评论
为什么被折叠?



