当前位置:   article > 正文

mybatisPlus使用MetaObjectHandler对字段进行更新

mybatisPlus使用MetaObjectHandler对字段进行更新

有一个比较好的实践方式

首先建立一个父类

/*所有domain类的通用字段*/
@Data
public class BaseDomain implements Serializable {

    /*这几个值是公用的,在 INSERT/UPDATE 操作的时候,会去自动更新这几个值,具体实现看 MyMetaObjecthandler*/
    @TableField(fill = FieldFill.INSERT_UPDATE)
    public Integer yn;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    public String creator;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    public String updater;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    public Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    public Date updateTime;

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

然后我们的实体类都去继承这个类


@TableName(value ="student")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student extends BaseDomain {

    @TableId(type = IdType.AUTO)
    private Integer id;
    private String studentName;
    private String studentPassword;
    private String teacheruuid;
    private String phone;
    private String address;

    @TableField(exist = false)
    private static final long serialVersionUID = 1L;

    @Override
    public boolean equals(Object that) {
        if (this == that) {
            return true;
        }
        if (that == null) {
            return false;
        }
        if (getClass() != that.getClass()) {
            return false;
        }
        Student other = (Student) that;
        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
            && (this.getStudentName() == null ? other.getStudentName() == null : this.getStudentName().equals(other.getStudentName()))
            && (this.getStudentPassword() == null ? other.getStudentPassword() == null : this.getStudentPassword().equals(other.getStudentPassword()))
            && (this.getTeacheruuid() == null ? other.getTeacheruuid() == null : this.getTeacheruuid().equals(other.getTeacheruuid()))
            && (this.getPhone() == null ? other.getPhone() == null : this.getPhone().equals(other.getPhone()))
            && (this.getAddress() == null ? other.getAddress() == null : this.getAddress().equals(other.getAddress()))
            && (this.getYn() == null ? other.getYn() == null : this.getYn().equals(other.getYn()))
            && (this.getCreator() == null ? other.getCreator() == null : this.getCreator().equals(other.getCreator()))
            && (this.getUpdater() == null ? other.getUpdater() == null : this.getUpdater().equals(other.getUpdater()))
            && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()))
            && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime()));
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
        result = prime * result + ((getStudentName() == null) ? 0 : getStudentName().hashCode());
        result = prime * result + ((getStudentPassword() == null) ? 0 : getStudentPassword().hashCode());
        result = prime * result + ((getTeacheruuid() == null) ? 0 : getTeacheruuid().hashCode());
        result = prime * result + ((getPhone() == null) ? 0 : getPhone().hashCode());
        result = prime * result + ((getAddress() == null) ? 0 : getAddress().hashCode());
        result = prime * result + ((getYn() == null) ? 0 : getYn().hashCode());
        result = prime * result + ((getCreator() == null) ? 0 : getCreator().hashCode());
        result = prime * result + ((getUpdater() == null) ? 0 : getUpdater().hashCode());
        result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode());
        result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode());
        return result;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(getClass().getSimpleName());
        sb.append(" [");
        sb.append("Hash = ").append(hashCode());
        sb.append(", id=").append(id);
        sb.append(", studentName=").append(studentName);
        sb.append(", studentPassword=").append(studentPassword);
        sb.append(", teacheruuid=").append(teacheruuid);
        sb.append(", phone=").append(phone);
        sb.append(", address=").append(address);
        sb.append(", yn=").append(yn);
        sb.append(", creator=").append(creator);
        sb.append(", updater=").append(updater);
        sb.append(", createTime=").append(createTime);
        sb.append(", updateTime=").append(updateTime);
        sb.append(", serialVersionUID=").append(serialVersionUID);
        sb.append("]");
        return sb.toString();
    }
}
  • 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
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83

然后去编写 MetaObjectHandler


/*该类的作用是:
 * 为实体类上添加了 INSERT_UPDATE 设置的类的 新增或者是更新操作做自动的属性填充*/
 * 
@Component //注意这里需要将其放入容器中
public class MyMetaObjecthandler implements MetaObjectHandler {
//		公共的属性有这几个
//    public Integer yn;
//    public String creator;
//    public String updater;
//    public Date createTime;
//    public Date updateTime;
    @Override
    public void insertFill(MetaObject metaObject) {
        Date now = new Date();
        /*如果对象在进行插入操作的时候,对象中的 yn 是没有值的,此时才需要给他进行默认的填充*/
        if (metaObject.getValue("yn") == null) {
            setFieldValByName("yn", 1, metaObject);
        }
        if (metaObject.getValue("creator") == null) {
            /*这里可以结合 security 的上下文来获取操作人 我这里写的简单了,就直接使用 admin 来赋值*/
            setFieldValByName("creator", "admin", metaObject);
        }
        if (metaObject.getValue("updater") == null) {
            /*这里可以结合 security 的上下文来获取操作人 我这里写的简单了,就直接使用 admin 来赋值*/
            setFieldValByName("updater", "admin", metaObject);
        }
        if (metaObject.getValue("createTime") == null) {
            setFieldValByName("createTime", now, metaObject);
        }
        if (metaObject.getValue("updateTime") == null) {
            setFieldValByName("updateTime", now, metaObject);
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {

        /*更新的时候 逻辑就不太一样了 更新的前提是有一个对象,那么该对象的一些值是不能随便乱动的,
         * 就比如yn,而更新人和更新时间则可以变化*/
        if (metaObject.getValue("updater") == null) {
            /*这里可以结合 security 的上下文来获取操作人 我这里写的简单了,就直接使用 admin 来赋值*/
            setFieldValByName("updater", "admin1231231", metaObject);
        }
        if (metaObject.getValue("updateTime") == null) {
            setFieldValByName("updateTime", new Date(), metaObject);
        }
    }
}

  • 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
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

这样就可以了,当然,也可以在里面对某个指定的类做这些操作,比如我只想对 Student这个类的对象在更新和插入的时候做这些操作怎么弄? 使用 metaObject 就可以实现 ,

例如:

        if ("com.example.jiubodou.domain.Student".equals( metaObject.getOriginalObject().getClass().getName()) ) {
 Date now = new Date();
        /*如果对象在进行插入操作的时候,对象中的 yn 是没有值的,此时才需要给他进行默认的填充*/
        if (metaObject.getValue("yn") == null) {
            setFieldValByName("yn", 1, metaObject);
        }
        if (metaObject.getValue("creator") == null) {
            /*这里可以结合 security 的上下文来获取操作人 我这里写的简单了,就直接使用 admin 来赋值*/
            setFieldValByName("creator", "admin", metaObject);
        }
        if (metaObject.getValue("updater") == null) {
            /*这里可以结合 security 的上下文来获取操作人 我这里写的简单了,就直接使用 admin 来赋值*/
            setFieldValByName("updater", "admin", metaObject);
        }
        if (metaObject.getValue("createTime") == null) {
            setFieldValByName("createTime", now, metaObject);
        }
        if (metaObject.getValue("updateTime") == null) {
            setFieldValByName("updateTime", now, metaObject);
        }     
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

经过测试:

studentService.save()
studentService.saveBatch()
studentService.updateBatchById()
都是符合我们的预期的

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/479032
推荐阅读
相关标签
  

闽ICP备14008679号