<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我們在開發中經常遇到多個實體類有共同的屬性欄位,例如在使用者註冊時需要設定建立時間、建立人、修改時間、修改人等欄位,在使用者編輯資訊時需要設定修改時間和修改人等欄位。這些欄位屬於公共欄位,也就是很多表中都有這些欄位,能不能對於這些公共欄位在某個地方統一處理,來簡化開發呢?
答案就是我們可是使用Mybatis Plus提供的公共欄位自動填充功能。
Mybatis Plus公共欄位自動填充,也就是在插入或者更新的時候為指定欄位賦予指定的值,使用它的好處就是可以統一對這些欄位進行處理,避免了重複程式碼。
實現步驟:
在實體類的屬性上加入@TableField註解,指定自動填充的策略
@TableField(fill = FieldFill.INSERT)//插入時填充欄位 private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE)//插入、更新時填充欄位 private LocalDateTime updateTime; @TableField(fill = FieldFill.INSERT)//插入時填充欄位 private Long createUser; @TableField(fill = FieldFill.INSERT_UPDATE)//插入、更新時填充欄位 private Long updateUser;
按照框架要求編寫後設資料物件處理器,在此類中統一為公共欄位賦值,此類需要實現MetaObjectHandler介面
package com.lyq.reggie.common; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.time.LocalDateTime; /** * 自定義後設資料物件處理器 */ @Component @Slf4j public class MyMetaObjecthandler implements MetaObjectHandler { /** * 插入操作,自動填充 * @param metaObject */ @Override public void insertFill(MetaObject metaObject) { log.info("公共欄位自動填充[insert]..."); log.info(metaObject.toString()); metaObject.setValue("createTime", LocalDateTime.now()); metaObject.setValue("updateTime",LocalDateTime.now()); metaObject.setValue("createUser", BaseContext.getCurrentId()); metaObject.setValue("updateUser",BaseContext.getCurrentId()); } /** * 更新操作,自動填充 * @param metaObject */ @Override public void updateFill(MetaObject metaObject) { log.info("公共欄位自動填充[update]..."); log.info(metaObject.toString()); long id = Thread.currentThread().getId(); log.info("執行緒id為:{}",id); metaObject.setValue("updateTime",LocalDateTime.now()); metaObject.setValue("updateUser",BaseContext.getCurrentId()); } }
這個時候我們嫌棄每個表都需要加對應的註解,麻煩,這個時候我們就可以使用Mybatis Plus提供全域性設定 sqlInjector 用於注入ISqlInjector介面的子類,實現自定義方法注入。
自定義自己的通用方法可以實現介面ISqlInjector也可以繼承抽象類 AbstractSqlInjector 注入通用方法 SQL 語句 然後繼承 BaseMapper 新增自定義方法,全域性設定 sqlInjector 注入 MP 會自動將類所有方法注入到 mybatis 容器中。
首先我們需要增加一個設定類,將這個資料過濾器註冊為bean
@Configuration public class MybatisPlusConfig { /* * @version V1.0 * Title: updateInterceptor * @author LiuYanQiang * @description 插入資料過濾器 * @createTime 2022/1/13 14:30 * @param [] * @return com.tfjybj.intelligentArticleSystem.config.MybatisPlusConfig.UpdateInterceptor*/ @Bean public UpdateInterceptor updateInterceptor() { return new UpdateInterceptor(); } }
再接著寫攔截方法繼承抽象類 AbstractSqlInjector 並且實現介面ISqlInjector來進行SQL的攔截實現公共欄位的全域性填充
package com.lyq.jsoup.config.MybatisPlusConfig; import com.baomidou.mybatisplus.extension.handlers.AbstractSqlParserHandler; import org.apache.commons.lang3.ArrayUtils; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.SqlCommandType; import org.apache.ibatis.plugin.*; import java.lang.reflect.Field; import java.sql.Timestamp; import java.util.Map; import java.util.Objects; import java.util.Properties; /** * @author : [LiuYanQiang] * @version : [v1.0] * @className : UpdateInterceptor * @description : [自動給建立時間個更新時間加值] * @createTime : [2022/1/12 9:09] * @updateUser : [LiuYanQiang] * @updateTime : [2022/1/12 9:09] * @updateRemark : [描述說明本次修改內容] */ @Intercepts(value = {@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})}) public class UpdateInterceptor extends AbstractSqlParserHandler implements Interceptor { /** * 建立時間 */ private static final String CREATE_TIME = "createTime"; /** * 更新時間 */ private static final String UPDATE_TIME = "updateTime"; @Override public Object intercept(Invocation invocation) throws Throwable { MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0]; // SQL操作命令 SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType(); // 獲取新增或修改的物件引數 Object parameter = invocation.getArgs()[1]; // 獲取物件中所有的私有成員變數(對應表欄位) Field[] declaredFields = parameter.getClass().getDeclaredFields(); if (parameter.getClass().getSuperclass() != null) { Field[] superField = parameter.getClass().getSuperclass().getDeclaredFields(); declaredFields = ArrayUtils.addAll(declaredFields, superField); } // mybatis plus判斷 boolean plus= parameter.getClass().getDeclaredFields().length == 1 && parameter.getClass().getDeclaredFields()[0].getName().equals("serialVersionUID"); //相容mybatis plus if (plus) { Map<String, Object> updateParam = (Map<String, Object>) parameter; Class<?> updateParamType = updateParam.get(updateParam.keySet().iterator().next()).getClass(); declaredFields = updateParamType.getDeclaredFields(); if (updateParamType.getSuperclass() != null) { Field[] superField = updateParamType.getSuperclass().getDeclaredFields(); declaredFields = ArrayUtils.addAll(declaredFields, superField); } } String fieldName = null; for (Field field : declaredFields) { fieldName = field.getName(); if (Objects.equals(CREATE_TIME, fieldName)) { if (SqlCommandType.INSERT.equals(sqlCommandType)) { field.setAccessible(true); field.set(parameter, new Timestamp(System.currentTimeMillis())); } } if (Objects.equals(UPDATE_TIME, fieldName)) { if (SqlCommandType.INSERT.equals(sqlCommandType) || SqlCommandType.UPDATE.equals(sqlCommandType)) { field.setAccessible(true); //相容mybatis plus的update if (plus) { Map<String, Object> updateParam = (Map<String, Object>) parameter; field.set(updateParam.get(updateParam.keySet().iterator().next()), new Timestamp(System.currentTimeMillis())); } else { field.set(parameter, new Timestamp(System.currentTimeMillis())); } } } } return invocation.proceed(); } @Override public Object plugin(Object target) { if (target instanceof Executor) { return Plugin.wrap(target, this); } return target; } @Override public void setProperties(Properties properties) { } }
到此這篇關於MyBatis-Plus實現公共欄位自動填充功能詳解的文章就介紹到這了,更多相關MyBatis-Plus欄位自動填充內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45