mybatis-plus 通用字段自動化(如邏輯刪除和更新時間等)
一般來說某些項目比較規(guī)范的情況下,大多數(shù)表都會有邏輯刪除字段和通用字段,例如更新時間,創(chuàng)建時間,更新人,創(chuàng)建人等等,但是在代碼開發(fā)上會產(chǎn)生很多冗余的代碼,邏輯刪除的話,自己寫比較繁瑣,而且容易有遺漏邏輯。
本來打算自己寫切面去實現(xiàn),偶然發(fā)現(xiàn)mybatis-plus已經(jīng)幫封裝實現(xiàn)了,試了一下,很好用,所以分享一下。
邏輯刪除
邏輯刪除的意思就是某些業(yè)務表,在用戶刪除某條數(shù)據(jù)的時候,不真正刪除,而是將此數(shù)據(jù)某字段改成類似“已刪除”,而查詢語句、更新語句等會忽略此條被邏輯刪除的數(shù)據(jù)。
這里就不多介紹mybatis-plus的基礎使用了,沒接觸過的小伙伴可以去官網(wǎng)研究一下,都是中文,很好看懂。
貼一下我們mybatis-plus的pom依賴:
<!-- mybatis plus 核心依賴 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency> <!-- mybatis plus 代碼生成器依賴 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.4.0</version> </dependency> <!-- 代碼生成器模板 --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.1</version> </dependency>
邏輯刪除比較簡單,在3.3版本之后只要兩步:
1.在配置文件中加入:
mybatis-plus: global-config: db-config: logic-delete-field: deleted # 全局邏輯刪除的實體字段名 logic-delete-value: 1 # 邏輯已刪除值(默認為 1) logic-not-delete-value: 0 # 邏輯未刪除值(默認為 0)
這里的deleted就是數(shù)據(jù)庫表中表示邏輯刪除與否的字段名,一般都是tinyint或者boolean,如果是boolean,logic-delete-value和logic-not-delete-value設置成true和false就行。
2.實體類字段上加上@TableLogic注解
@TableLogic private Boolean deleted;
當然,一般自動生成的entity一般不建議做改動,因為entity和mapper經(jīng)常會重新生成,這樣加的代碼就消失了,這里我們修改mybatis-plus代碼生成器中的一個配置實現(xiàn):
StrategyConfig strategy = new StrategyConfig(); // 省略命名規(guī)范、entity模式等其他配置 strategy.setLogicDeleteFieldName("deleted");
這里deleted同樣是表字段名,而不是生成的類字段名。
加了這段配置后,自動生成的entity就會帶有@TableLogic注解了。
在使用了封裝化的邏輯刪除后,mybatis-plus就能幫我們實現(xiàn):
- 調(diào)用mapper.delete類方法后,不刪除對應的記錄,而是將匹配到的記錄的邏輯刪除字段設置為我們設定的logic-delete-value值。
- 調(diào)用查詢語句包括selectList、selectById等語句或者更新語句時,會自動拼上邏輯刪除字段的查詢條件,達到不會查詢出已邏輯刪除的記錄
通用字段自動化填充
如果說項目要求表設計上需要有一些通用字段,比如我現(xiàn)在做的項目每個主體表都需要有創(chuàng)建時間、更新時間、創(chuàng)建人、更新人這四個字段,mybatis-plus可以幫我們自動填充這四個字段,而不需要我們自己修改。
當然,這四個字段的獲取邏輯必須是有通用方式的。
1.@TableField注解
@TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(fill = FieldFill.UPDATE) private LocalDateTime updateTime;
這里只是一個例子,F(xiàn)ieldFill.INSERT表示在執(zhí)行insert類方法時會自動填充此字段,F(xiàn)ieldFill.UPDATE是在執(zhí)行update類方法時會自動填充此字段,除此之外還有FieldFill.INSERT_UPDATE表示插入和更新時都會填充。
當然,和邏輯刪除一樣,我們不會手動去加這個注解,還是依賴代碼生成器的配置:
// 和邏輯刪除一樣的StrategyConfig,不要重復寫 StrategyConfig strategy = new StrategyConfig(); // 省略命名規(guī)范、entity模式等其他配置 List<TableFill> tableFillList = new ArrayList<>(); tableFillList.add(new TableFill("create_time", FieldFill.INSERT)); tableFillList.add(new TableFill("create_user", FieldFill.INSERT)); tableFillList.add(new TableFill("update_time", FieldFill.UPDATE)); tableFillList.add(new TableFill("update_user", FieldFill.UPDATE)); strategy.setTableFillList(tableFillList);
這里的create_time、create_user等是表里的字段名,當mybatis-plus檢測到表里有這些字段時,生成的entity會自動加上對應的@TableField注解。
2.自動填充處理類
@Component public class MybatisPlusMetaFillHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class); this.strictInsertFill(metaObject,"createUser", ()-> { try{ //這里是我自己項目獲取當前session用戶id的方法 return Long.parseLong(UserContext.getUserInfo().get().getUserId()); }catch(Exception ignored){ } return null; }, Long.class); } @Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class); this.strictUpdateFill(metaObject,"updateUser", ()-> { try{ //這里是我自己項目獲取當前session用戶id的方法 return Long.parseLong(UserContext.getUserInfo().get().getUserId()); }catch(Exception ignored){ } return null; }, Long.class); } }
自定義bean實現(xiàn)MetaObjectHandler接口,并實現(xiàn)insertFill方法和updateFill方法,this.strictUpdateFill方法中添加需要自動填充的entity字段名和填充Function,比如創(chuàng)建時間和更新時間,傳入LocalDateTime::now方法,當然也可以用自定義的方法:
()->{ //比方說我們更新時間不想太精確,只想設定為那一天的0點 return LocalDateTime.now().toLocalDate().atStartOfDay(); }
這兩個步驟完成后,mybatis-plus就可以自動填充此字段了,比如在新增一條記錄時,只需要set此記錄的業(yè)務值,不設置create_time和create_user,直接調(diào)用entity.insert()方法,可以在數(shù)據(jù)庫新增的記錄中看到create_time自動填充了當前時間,create_user自動填充了session中的當前用戶id。
這是字段自動填充一個應用,可拓展方向有很多,大家可以多多思考,自行發(fā)揮。
到此這篇關于mybatis-plus 通用字段自動化(如邏輯刪除和更新時間等)的文章就介紹到這了,更多相關mybatis-plus 字段自動化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springboot如何使用@ConfigurationProperties封裝配置文件
springboot如何使用@ConfigurationProperties封裝配置文件的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08SpringCloud微服務剔除下線功能實現(xiàn)原理分析
SpringCloud是一種微服務的框架,利用它我們可以去做分布式服務開發(fā),這篇文章主要介紹了SpringCloud微服務剔除下線功能,需要的朋友可以參考下2022-11-11