MyBatis-Plus實現(xiàn)自動填充功能的示例代碼
01 引言
在數(shù)據(jù)庫設(shè)計中,常常有一些字段每次都需要賦值,如創(chuàng)建時間、更新時間、操作人、刪除標(biāo)識等。很多時候,為了趕項目匆匆的賦值了一些業(yè)務(wù)字段,而漏掉了這些字段,導(dǎo)致查詢問題的時候,時間點或者操作人對不上,加大了定位問題的難度。
有沒有框架級的技術(shù),全局處理這樣的統(tǒng)一字段呢?當(dāng)然有。
Mybatis-Plus自動填充技術(shù)幫我們解決問題。
02 自動填充實現(xiàn)
使用Mybtis-Plus之前,我們需要簡單的搭建環(huán)境。
2.1 Mybatis-Plus 簡單搭建
Maven
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
配置
# 數(shù)據(jù)源 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test spring.datasource.username=root spring.datasource.password=root # 日志實現(xiàn) mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl # 開啟駝峰匹配 mybatis-plus.configuration.map-underscore-to-camel-case=true # 配置全局?jǐn)?shù)據(jù)庫主鍵 mybatis-plus.global-config.db-config.id-type=auto
啟動類增加Mapper掃描
@MapperScan("com.simonking.boot.mybaits.mapper")
實體
@Data
@TableName("user_info")
public class UserInfo {
/**
* 主鍵ID
**/
@TableId
private Integer id;
/**
* 姓名
**/
private String name;
/**
* 年齡
**/
private Integer age;
/**
* 性別
**/
private String sex;
/**
* 工作
**/
private String job;
/**
* 生日
**/
private LocalDateTime birthday;
/**
* 創(chuàng)建時間
**/
private LocalDateTime createdTime;
/**
* 更新時間
**/
private LocalDateTime updateTime;
}
繼承BaseMapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
}
到這里,Mybatis-Plus就搭建好了,可以注解注入xxxMapper調(diào)用方法了。
2.2 標(biāo)記自動填充的字段
在實體類中,你需要使用 @TableField 注解來標(biāo)記哪些字段需要自動填充,并指定填充的策略。
@Data
@TableName("user_info")
public class UserInfo {
// 其他字段...
/**
* 創(chuàng)建時間
**/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createdTime;
/**
* 更新時間
**/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
FieldFill填充的枚舉:
public enum FieldFill {
DEFAULT, // 默認(rèn)不處理
INSERT, // 插入填充字段
UPDATE, // 更新填充字段
INSERT_UPDATE // 插入和更新填充字段
}
2.3 實現(xiàn)MetaObjectHandler
創(chuàng)建一個類來實現(xiàn) MetaObjectHandler 接口,并重寫 insertFill 和 updateFill 方法。并確保實現(xiàn)類被Spring管理,可以通過 @Component 或 @Bean 注解來實現(xiàn)。
@Slf4j
@Component
public class AutoFillMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("insertFill 開始自動填充......");
this.strictInsertFill(metaObject, "createdTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("updateFill 開始自動填充......");
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
2.4 測試
@Test
void contextLoads01() {
UserInfo userInfo = new UserInfo();
userInfo.setName("test");
userInfo.setAge(18);
userInfoMapper.insert(userInfo);
}

從運行結(jié)果來看,cteated_time和update_time已經(jīng)被賦值了。
2.5 思考
這種全局的自動填充有什么問題呢?
先看截圖:

這里填充的時候,需要指定字段的名稱。但是如果因為開發(fā)人員定義錯字段,如update_time -> updated_time等,這里就需要窮舉所有的字段。
有人可能說是開發(fā)規(guī)范的問題,的確是。但是這種問題確實有點別扭。
能不能通過注解字段指定別名,統(tǒng)一自動賦值的字段呢?官方暫時不支持這種方式。
03 實現(xiàn)原理
自動賦值的的觸發(fā)機制是如何實現(xiàn)的呢?第一反應(yīng),應(yīng)該是使用了Mybatis的攔截器插件,細(xì)看了之后,并不是。我們一起來看看。
Mybatis-Plus自動填充調(diào)用MetaObjectHandler,涉及了兩個的類:
com.baomidou.mybatisplus.core.MybatisParameterHandler
3.1 MybatisParameterHandler
com.baomidou.mybatisplus.core.MybatisParameterHandler是對Mybaits原生的org.apache.ibatis.scripting.defaults.DefaultParameterHandler的增強。DefaultParameterHandler是Mybatis處理SQL參數(shù)的核心類,負(fù)責(zé):
- 將
Java對象轉(zhuǎn)換為JDBC參數(shù) - 設(shè)置
PreparedStatement的參數(shù)值 - 處理類型轉(zhuǎn)換器(
TypeHandler)
MybatisParameterHandler自然也就具備了這些功能。構(gòu)造函數(shù)的功能:



我們從源碼中可以看到,在創(chuàng)建MybatisParameterHandler對象的時候,就會根據(jù)sqlCommandType執(zhí)行insertFill()還是updateFill()。
3.2 實例化
我們來看看org.apache.ibatis.executor.parameter.ParameterHandler是怎么實例化的:



04 小結(jié)
上面就是Mybatis-Plus自動填充的實現(xiàn)和源碼分析,下一期,我們將自己通過攔截器或者注解的方式,實現(xiàn)屬于我們自己的自動填充的功能。
到此這篇關(guān)于MyBatis-Plus實現(xiàn)自動填充功能的示例代碼的文章就介紹到這了,更多相關(guān)MyBatis-Plus自動填充內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot 雙數(shù)據(jù)源配置及實現(xiàn)原理
雙數(shù)據(jù)源指應(yīng)用同時連接兩個數(shù)據(jù)庫,實現(xiàn)業(yè)務(wù)分離、性能優(yōu)化及數(shù)據(jù)安全,Spring通過AbstractRoutingDataSource動態(tài)切換數(shù)據(jù)源,結(jié)合AOP設(shè)置鍵值,需注意@Transactional無法跨數(shù)據(jù)源,建議使用分布式事務(wù)框架,本文給大家介紹Spring Boot雙數(shù)據(jù)源配置,感興趣的朋友一起看看吧2025-07-07
Springboot中設(shè)置時間格式問題小結(jié)
本文主要介紹了Springboot中設(shè)置時間格式問題小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04
java中將一個實體類復(fù)制到另一個實體類的3種方法示例
這篇文章主要給大家介紹了關(guān)于java中將一個實體類復(fù)制到另一個實體類的3種方法,所謂實體類就是一個擁有Set和Get方法的類,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07
調(diào)用Process.waitfor導(dǎo)致的進(jìn)程掛起問題及解決
這篇文章主要介紹了調(diào)用Process.waitfor導(dǎo)致的進(jìn)程掛起問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
IDEA創(chuàng)建Java項目保姆級教程(超詳細(xì)!)
這篇文章主要給大家介紹了關(guān)于IDEA創(chuàng)建Java項目保姆級教程的相關(guān)資料,Java是一種廣泛使用的編程語言,廣泛用于Web應(yīng)用程序和客戶端應(yīng)用程序的開發(fā),文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09
Spring?Boot和Vue前后端分離項目架構(gòu)的全過程
前后端分離是目前互聯(lián)網(wǎng)開發(fā)中比較廣泛使用的開發(fā)模式,主要是將前端和后端的項目業(yè)務(wù)進(jìn)行分離,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot和Vue前后端分離項目架構(gòu)的相關(guān)資料,需要的朋友可以參考下2022-04-04

