MyBatisPlus--自动填充功能

自动填充

有些时候我们可能会有这样的需求:插入获更新数据时,希望有些字段可以自动填充数据,比如密码、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("[email protected]");
        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方法
发布了750 篇原创文章 · 获赞 2115 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/cold___play/article/details/104276849