mybatisPlus如何使用MetaObjectHandler對(duì)字段進(jìn)行更新
有一個(gè)比較好的實(shí)踐方式:
首先建立一個(gè)父類
/*所有domain類的通用字段*/ @Data public class BaseDomain implements Serializable { /*這幾個(gè)值是公用的,在 INSERT/UPDATE 操作的時(shí)候,會(huì)去自動(dòng)更新這幾個(gè)值,具體實(shí)現(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; }
然后我們的實(shí)體類都去繼承這個(gè)類
@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
/*該類的作用是: * 為實(shí)體類上添加了 INSERT_UPDATE 設(shè)置的類的 新增或者是更新操作做自動(dòng)的屬性填充*/ * @Component //注意這里需要將其放入容器中 public class MyMetaObjecthandler implements MetaObjectHandler { // 公共的屬性有這幾個(gè) // 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(); /*如果對(duì)象在進(jìn)行插入操作的時(shí)候,對(duì)象中的 yn 是沒有值的,此時(shí)才需要給他進(jìn)行默認(rèn)的填充*/ if (metaObject.getValue("yn") == null) { setFieldValByName("yn", 1, metaObject); } if (metaObject.getValue("creator") == null) { /*這里可以結(jié)合 security 的上下文來獲取操作人 我這里寫的簡(jiǎn)單了,就直接使用 admin 來賦值*/ setFieldValByName("creator", "admin", metaObject); } if (metaObject.getValue("updater") == null) { /*這里可以結(jié)合 security 的上下文來獲取操作人 我這里寫的簡(jiǎn)單了,就直接使用 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) { /*更新的時(shí)候 邏輯就不太一樣了 更新的前提是有一個(gè)對(duì)象,那么該對(duì)象的一些值是不能隨便亂動(dòng)的, * 就比如yn,而更新人和更新時(shí)間則可以變化*/ if (metaObject.getValue("updater") == null) { /*這里可以結(jié)合 security 的上下文來獲取操作人 我這里寫的簡(jiǎn)單了,就直接使用 admin 來賦值*/ setFieldValByName("updater", "admin1231231", metaObject); } if (metaObject.getValue("updateTime") == null) { setFieldValByName("updateTime", new Date(), metaObject); } } }
這樣就可以了,當(dāng)然,也可以在里面對(duì)某個(gè)指定的類做這些操作,比如我只想對(duì) Student這個(gè)類的對(duì)象在更新和插入的時(shí)候做這些操作怎么弄? 使用 metaObject 就可以實(shí)現(xiàn) ,
例如:
if ("com.example.jiubodou.domain.Student".equals( metaObject.getOriginalObject().getClass().getName()) ) { Date now = new Date(); /*如果對(duì)象在進(jìn)行插入操作的時(shí)候,對(duì)象中的 yn 是沒有值的,此時(shí)才需要給他進(jìn)行默認(rèn)的填充*/ if (metaObject.getValue("yn") == null) { setFieldValByName("yn", 1, metaObject); } if (metaObject.getValue("creator") == null) { /*這里可以結(jié)合 security 的上下文來獲取操作人 我這里寫的簡(jiǎn)單了,就直接使用 admin 來賦值*/ setFieldValByName("creator", "admin", metaObject); } if (metaObject.getValue("updater") == null) { /*這里可以結(jié)合 security 的上下文來獲取操作人 我這里寫的簡(jiǎn)單了,就直接使用 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)過測(cè)試
studentService.save()
studentService.saveBatch()
studentService.updateBatchById()
都是符合我們的預(yù)期的
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring容器注冊(cè)組件實(shí)現(xiàn)過程解析
這篇文章主要介紹了Spring容器注冊(cè)組件實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03Java讀寫鎖ReadWriteLock原理與應(yīng)用場(chǎng)景詳解
這篇文章主要介紹了Java讀寫鎖ReadWriteLock原理與應(yīng)用場(chǎng)景詳解,讀寫狀態(tài)的設(shè)計(jì),寫鎖的獲取與釋放,鎖降級(jí)需要的朋友可以參考下2023-02-02Android中PreferenceActivity使用詳解
本文主要介紹了Android中PreferenceActivity使用詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09idea新建Springboot項(xiàng)目,設(shè)置默認(rèn)maven和jdk版本方式
這篇文章主要介紹了idea新建Springboot項(xiàng)目,設(shè)置默認(rèn)maven和jdk版本方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12JavaSwing基礎(chǔ)之Layout布局相關(guān)知識(shí)詳解
上次我們說到View的Mearsure流程,今天接著說說layout. 關(guān)于layout,很多朋友知道它是負(fù)責(zé)布局的,那么具體是怎么布局的?viewGroup和view的layout方法又有什么不同?一起來看看吧,需要的朋友可以參考下2021-05-05Java jwt使用公鑰字符串驗(yàn)證解析token鎖方法詳解
關(guān)于java獲取Token驗(yàn)證的問題相信很多人都遇見過,尤其是對(duì)剛接觸微信開發(fā)的人來說確實(shí)有點(diǎn)棘手,下面這篇文章主要給大家介紹了關(guān)于Java中token驗(yàn)證解析的相關(guān)資料,需要的朋友可以參考下2023-02-02