自动填充
有些时候我们可能会有这样的需求:插入获更新数据时,希望有些字段可以自动填充数据,比如密码、version等。在MP中提供了这样的功能,可以实现自动填充。
添加@TableField注解
在需要自动填充的字段对应的实体类属性上添加@TableField注解:
@NoArgsConstructor
@AllArgsConstructor
@TableName("tb_user")
public class User extends Model<User> {
//指定主键为自增
@TableId(type = IdType.AUTO)
private Long id;
//指定数据表中字段名
@TableField(value = "user_name")
private String userName;
@TableField(fill = FieldFill.INSERT)
private String password;
private String name;
private Integer age;
private String email;
//指定该字段在表中是不存在的
@TableField(exist = false)
private String address;
}
fill属性取值:
- DEFAULT:默认不处理
- INSERT:插入填充字段
- UPDATE:更新填充字段
- INSERT_UPDATE:插入更新填充字段
实现MetaObjectHandler接口
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
/*
插入数据时填充
*/
@Override
public void insertFill(MetaObject metaObject) {
//先获取到password的值,再进行判断,如果为空,就进行填充,如果不为空,就不处理
Object password = getFieldValByName("password", metaObject);
if (password == null){
setFieldValByName("password", "88888", metaObject);
}
}
@Override
public void updateFill(MetaObject metaObject) {
}
}
测试
不添加密码属性:
@Test
public void testInsert(){
User user = new User();
user.setEmail("123456@qq.com");
user.setAge(30);
user.setName("xiaoqiang");
user.setUserName("小强");
user.setAddress("北京");
//返回受影响的行数
int rows = userMapper.insert(user);
System.out.println(rows);
//获取自增长后的id值,MP会自动回填自增后的id
System.out.println(user.getId());
}
结果:
注意事项:
- 字段必须声明TableField注解,属性fill选择对应策略,该声明告知Mybatis-Plus需要预留注入SQL字段
- 填充处理器MyMetaObjectHandler在 Spring Boot 中需要声明@Component或@Bean注入
- 要想根据注解FieldFill.xxx和字段名以及字段类型来区分必须使用父类的strictInsertFill或者strictUpdateFill方法
- 不需要根据任何来区分可以使用父类的fillStrategy方法