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

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

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



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



04 小結(jié)
上面就是Mybatis-Plus自動(dòng)填充的實(shí)現(xiàn)和源碼分析,下一期,我們將自己通過(guò)攔截器或者注解的方式,實(shí)現(xiàn)屬于我們自己的自動(dòng)填充的功能。
到此這篇關(guān)于MyBatis-Plus實(shí)現(xiàn)自動(dòng)填充功能的示例代碼的文章就介紹到這了,更多相關(guān)MyBatis-Plus自動(dòng)填充內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot整合netty的實(shí)現(xiàn)方法
這篇文章主要介紹了spring boot整合netty的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
SpringBoot--Banner的定制和關(guān)閉操作
這篇文章主要介紹了SpringBoot--Banner的定制和關(guān)閉操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2018-05-05
tdesign的文件上傳功能實(shí)現(xiàn)(微信小程序+idea的springboot)
這篇文章主要介紹了tdesign的文件上傳(微信小程序+idea的springboot)的相關(guān)知識(shí),本文通過(guò)圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-09-09
Spring Boot插件spring tool suite安裝及使用詳解
這篇文章主要介紹了Spring Boot插件spring tool suite安裝及使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
關(guān)于mybatis mapper類注入失敗的解決方案
這篇文章主要介紹了關(guān)于mybatis mapper類注入失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
Java?Web?Axios實(shí)現(xiàn)前后端數(shù)據(jù)異步交互實(shí)例代碼
Axios作為一個(gè)流行的前端?HTTP?通信庫(kù),可以極大地簡(jiǎn)化前端與后端之間的數(shù)據(jù)交互,這篇文章主要介紹了Java?Web?Axios實(shí)現(xiàn)前后端數(shù)據(jù)異步交互的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09
java發(fā)送飛書(shū)消息卡片具體實(shí)現(xiàn)方法
這篇文章主要介紹了java發(fā)送飛書(shū)消息卡片具體實(shí)現(xiàn)方法的相關(guān)資料,Java通過(guò)飛書(shū)消息卡片API,可以高效解決傳統(tǒng)消息推送方式的痛點(diǎn),實(shí)現(xiàn)業(yè)務(wù)系統(tǒng)事件與飛書(shū)消息卡片之間的全流程閉環(huán),需要的朋友可以參考下2026-03-03
HashMap實(shí)現(xiàn)保存兩個(gè)key相同的數(shù)據(jù)
這篇文章主要介紹了HashMap實(shí)現(xiàn)保存兩個(gè)key相同的數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

