最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis-Plus實(shí)現(xiàn)自動(dòng)填充功能的示例代碼

 更新時(shí)間:2025年07月30日 10:45:32   作者:SimonKing  
在數(shù)據(jù)庫(kù)設(shè)計(jì)中,常常有一些字段每次都需要賦值,如創(chuàng)建時(shí)間、更新時(shí)間、操作人、刪除標(biāo)識(shí)等,有沒(méi)有框架級(jí)的技術(shù),全局處理這樣的統(tǒng)一字段呢?當(dāng)然有,Mybatis-Plus自動(dòng)填充技術(shù)幫我們解決問(wèn)題,本文給大家詳細(xì)介紹了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ě) insertFillupdateFill 方法。并確保實(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_timeupdate_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)。DefaultParameterHandlerMybatis處理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)方法

    這篇文章主要介紹了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)閉操作

    這篇文章主要介紹了SpringBoot--Banner的定制和關(guān)閉操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2018-05-05
  • springboot如何集成Swagger2

    springboot如何集成Swagger2

    這篇文章主要介紹了springboot集成Swagger2的方法,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-12-12
  • Java數(shù)組的定義與使用

    Java數(shù)組的定義與使用

    數(shù)組是有序的元素序列,若將有限個(gè)類型相同的變量的集合命名,那么這個(gè)名稱為數(shù)組名。本文通過(guò)代碼示例詳細(xì)介紹了Java數(shù)組的定義和使用,對(duì)學(xué)習(xí)或工作有一定的幫助,需要的小伙伴歡迎閱讀
    2023-04-04
  • tdesign的文件上傳功能實(shí)現(xiàn)(微信小程序+idea的springboot)

    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安裝及使用詳解

    這篇文章主要介紹了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類注入失敗的解決方案

    這篇文章主要介紹了關(guān)于mybatis mapper類注入失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • Java?Web?Axios實(shí)現(xiàn)前后端數(shù)據(jù)異步交互實(shí)例代碼

    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)方法

    這篇文章主要介紹了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ù)

    這篇文章主要介紹了HashMap實(shí)現(xiàn)保存兩個(gè)key相同的數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評(píng)論

扎兰屯市| 赤水市| 临夏市| 阜平县| 普兰店市| 金川县| 丽江市| 阳新县| 沈丘县| 通江县| 惠安县| 梅河口市| 二手房| 自治县| 呼和浩特市| 轮台县| 荆州市| 班玛县| 昭觉县| 柳林县| 胶南市| 渝北区| 娱乐| 玉溪市| 上高县| 伊宁市| 常山县| 平和县| 沂源县| 南通市| 青阳县| 仙游县| 涞源县| 阳泉市| 唐海县| 泰来县| 惠州市| 星子县| 同江市| 古浪县| 和田市|