欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mybatisPlus如何使用MetaObjectHandler對字段進行更新

 更新時間:2024年04月29日 09:11:44   作者:九伯都  
這篇文章主要介紹了mybatisPlus如何使用MetaObjectHandler對字段進行更新問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

有一個比較好的實踐方式:

首先建立一個父類

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

    /*這幾個值是公用的,在 INSERT/UPDATE 操作的時候,會去自動更新這幾個值,具體實現(xiàn)看 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;

}

然后我們的實體類都去繼承這個類

@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();
    }
}

然后去編寫 MetaObjectHandler

/*該類的作用是:
 * 為實體類上添加了 INSERT_UPDATE 設(shè)置的類的 新增或者是更新操作做自動的屬性填充*/
 * 
@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) {
            /*這里可以結(jié)合 security 的上下文來獲取操作人 我這里寫的簡單了,就直接使用 admin 來賦值*/
            setFieldValByName("creator", "admin", metaObject);
        }
        if (metaObject.getValue("updater") == null) {
            /*這里可以結(jié)合 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) {
            /*這里可以結(jié)合 security 的上下文來獲取操作人 我這里寫的簡單了,就直接使用 admin 來賦值*/
            setFieldValByName("updater", "admin1231231", metaObject);
        }
        if (metaObject.getValue("updateTime") == null) {
            setFieldValByName("updateTime", new Date(), metaObject);
        }
    }
}

這樣就可以了,當然,也可以在里面對某個指定的類做這些操作,比如我只想對 Student這個類的對象在更新和插入的時候做這些操作怎么弄? 使用 metaObject 就可以實現(xiàn) ,

例如:

        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) {
            /*這里可以結(jié)合 security 的上下文來獲取操作人 我這里寫的簡單了,就直接使用 admin 來賦值*/
            setFieldValByName("creator", "admin", metaObject);
        }
        if (metaObject.getValue("updater") == null) {
            /*這里可以結(jié)合 security 的上下文來獲取操作人 我這里寫的簡單了,就直接使用 admin 來賦值*/
            setFieldValByName("updater", "admin", metaObject);
        }
        if (metaObject.getValue("createTime") == null) {
            setFieldValByName("createTime", now, metaObject);
        }
        if (metaObject.getValue("updateTime") == null) {
            setFieldValByName("updateTime", now, metaObject);
        }     
}

經(jīng)過測試

studentService.save()
studentService.saveBatch()
studentService.updateBatchById()

都是符合我們的預期的

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring容器注冊組件實現(xiàn)過程解析

    Spring容器注冊組件實現(xiàn)過程解析

    這篇文章主要介紹了Spring容器注冊組件實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • 詳解Spring Boot Profiles 配置和使用

    詳解Spring Boot Profiles 配置和使用

    本篇文章主要介紹了詳解Spring Boot Profiles 配置和使用,具有一定的參考價值,有興趣的可以了解一下
    2017-06-06
  • Java讀寫鎖ReadWriteLock原理與應用場景詳解

    Java讀寫鎖ReadWriteLock原理與應用場景詳解

    這篇文章主要介紹了Java讀寫鎖ReadWriteLock原理與應用場景詳解,讀寫狀態(tài)的設(shè)計,寫鎖的獲取與釋放,鎖降級需要的朋友可以參考下
    2023-02-02
  • Android中PreferenceActivity使用詳解

    Android中PreferenceActivity使用詳解

    本文主要介紹了Android中PreferenceActivity使用詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java注解(Annotations)的定義和使用詳解

    Java注解(Annotations)的定義和使用詳解

    Java注解(Annotations)是Java5引入的一種元數(shù)據(jù)(Metadata),它提供了一種在源代碼中嵌入補充信息的方式,這些信息可以被編譯器、JVM或其他工具在編譯時、運行時進行處理,注解本身不會直接影響程序的執(zhí)行,但可以用來指導編譯器、JVM或其他工具的行為,從而實現(xiàn)各種功能
    2025-03-03
  • idea新建Springboot項目,設(shè)置默認maven和jdk版本方式

    idea新建Springboot項目,設(shè)置默認maven和jdk版本方式

    這篇文章主要介紹了idea新建Springboot項目,設(shè)置默認maven和jdk版本方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • idea中database不顯示問題的解決

    idea中database不顯示問題的解決

    這篇文章主要介紹了idea中database不顯示問題的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • JavaSwing基礎(chǔ)之Layout布局相關(guān)知識詳解

    JavaSwing基礎(chǔ)之Layout布局相關(guān)知識詳解

    上次我們說到View的Mearsure流程,今天接著說說layout. 關(guān)于layout,很多朋友知道它是負責布局的,那么具體是怎么布局的?viewGroup和view的layout方法又有什么不同?一起來看看吧,需要的朋友可以參考下
    2021-05-05
  • SpringBoot中condition注解的使用方式

    SpringBoot中condition注解的使用方式

    這篇文章主要介紹了SpringBoot中condition注解的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Java jwt使用公鑰字符串驗證解析token鎖方法詳解

    Java jwt使用公鑰字符串驗證解析token鎖方法詳解

    關(guān)于java獲取Token驗證的問題相信很多人都遇見過,尤其是對剛接觸微信開發(fā)的人來說確實有點棘手,下面這篇文章主要給大家介紹了關(guān)于Java中token驗證解析的相關(guān)資料,需要的朋友可以參考下
    2023-02-02

最新評論