" />

欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis-Plus 自動填充的實現(xiàn)示例

 更新時間:2024年09月25日 09:02:39   作者:Flying_Fish_Xuan  
MyBatis-Plus 提供了自動填充功能,幫助開發(fā)者在插入或更新數(shù)據(jù)時,自動為某些字段賦值,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在日常開發(fā)中,數(shù)據(jù)庫表通常會包含一些系統(tǒng)自動維護的字段,例如:創(chuàng)建時間、更新時間、操作人等。為了減少手動維護這些字段的重復(fù)代碼,MyBatis-Plus 提供了自動填充功能,幫助開發(fā)者在插入或更新數(shù)據(jù)時,自動為某些字段賦值。

1. MyBatis-Plus 自動填充簡介

MyBatis-Plus 提供的自動填充功能,可以在數(shù)據(jù)庫插入或更新時,自動為指定的字段設(shè)置值,而不需要每次手動傳遞。例如:

  • 在記錄插入時自動填充創(chuàng)建時間 created_at。
  • 在記錄更新時自動填充更新時間 updated_at。
  • 自動填充操作用戶 ID 或者一些其他固定值。

MyBatis-Plus 通過 @TableField 注解中的 fill 屬性和 MetaObjectHandler 接口來實現(xiàn)自動填充。fill 屬性用于指定字段在插入或更新時是否自動填充,而 MetaObjectHandler 是用于實現(xiàn)自動填充邏輯的接口。

2. 自動填充的配置步驟

2.1 在實體類中標(biāo)注需要自動填充的字段

MyBatis-Plus 通過 @TableField(fill = ...) 注解來標(biāo)注需要自動填充的字段,并指定該字段的填充策略。常見的填充策略有:

  • FieldFill.INSERT:在插入時自動填充。
  • FieldFill.UPDATE:在更新時自動填充。
  • FieldFill.INSERT_UPDATE:在插入和更新時都自動填充。

示例:

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.time.LocalDateTime;

@Data
public class User {

    private Integer id;

    private String username;

    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createdAt;  // 插入時自動填充

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;  // 插入和更新時自動填充
}
  • createdAt:在插入記錄時自動填充當(dāng)前時間。
  • updatedAt:在插入和更新記錄時自動填充當(dāng)前時間。

2.2 創(chuàng)建自動填充處理器

MyBatis-Plus 提供了 MetaObjectHandler 接口,開發(fā)者可以實現(xiàn)該接口中的 insertFill 和 updateFill 方法來自定義填充邏輯。

示例:

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    // 插入時自動填充
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createdAt", LocalDateTime::now, LocalDateTime.class);  // 創(chuàng)建時間
        this.strictInsertFill(metaObject, "updatedAt", LocalDateTime::now, LocalDateTime.class);  // 更新時間
    }

    // 更新時自動填充
    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updatedAt", LocalDateTime::now, LocalDateTime.class);  // 更新時間
    }
}
  • strictInsertFill:用于在插入操作時自動填充指定字段。
  • strictUpdateFill:用于在更新操作時自動填充指定字段。

在 insertFill 方法中,createdAt 和 updatedAt 字段會在插入時自動填充當(dāng)前時間。而在 updateFill 方法中,updatedAt 字段會在更新時自動填充當(dāng)前時間。

2.3 完整示例

以下是一個完整的 MyBatis-Plus 自動填充示例,包含實體類、填充處理器和測試代碼:

1. User 實體類

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
import lombok.Data;
import java.time.LocalDateTime;

@Data
public class User {

    @TableId(type = IdType.AUTO)
    private Integer id;

    private String username;

    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createdAt;  // 創(chuàng)建時自動填充

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;  // 創(chuàng)建和更新時自動填充
}

2. 自動填充處理器

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createdAt", LocalDateTime::now, LocalDateTime.class);
        this.strictInsertFill(metaObject, "updatedAt", LocalDateTime::now, LocalDateTime.class);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updatedAt", LocalDateTime::now, LocalDateTime.class);
    }
}

3. UserMapper 接口

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.model.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

4. 測試代碼

import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class MyTestRunner implements CommandLineRunner {

    @Autowired
    private UserMapper userMapper;

    @Override
    public void run(String... args) throws Exception {
        // 測試插入時自動填充
        User user = new User();
        user.setUsername("John Doe");
        userMapper.insert(user);
        System.out.println("Inserted user: " + user);

        // 測試更新時自動填充
        user.setUsername("Jane Doe");
        userMapper.updateById(user);
        System.out.println("Updated user: " + user);
    }
}

在上面的測試代碼中:

  • 插入新用戶時,createdAt 和 updatedAt 字段都會被自動填充。
  • 更新用戶時,updatedAt 字段會被自動更新。

3. 自動填充策略詳解

3.1 自動填充策略選項

@TableField 注解的 fill 屬性支持以下自動填充策略:

  • FieldFill.INSERT:僅在插入時自動填充。
  • FieldFill.UPDATE:僅在更新時自動填充。
  • FieldFill.INSERT_UPDATE:在插入和更新時都自動填充。
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updatedAt;

3.2 MetaObjectHandler 方法詳解

strictInsertFill:用于插入時自動填充字段,接受 4 個參數(shù):MetaObject、字段名、填充值和字段類型。

this.strictInsertFill(metaObject, "createdAt", LocalDateTime::now, LocalDateTime.class);

strictUpdateFill:用于更新時自動填充字段。

this.strictUpdateFill(metaObject, "updatedAt", LocalDateTime::now, LocalDateTime.class);

如果不需要區(qū)分插入和更新,可以直接使用 setFieldValByName 方法:

this.setFieldValByName("updatedAt", LocalDateTime.now(), metaObject);

3.3 手動觸發(fā)填充

在某些場景下,可能希望在代碼中手動觸發(fā)自動填充邏輯,可以使用 fillStrategy 方法。

MetaObject metaObject = SystemMetaObject.forObject(user);
this.fillStrategy(metaObject, "updatedAt", LocalDateTime.now());

4. 自動填充的注意事項

4.1 數(shù)據(jù)庫默認值沖突

如果數(shù)據(jù)庫字段設(shè)置了默認值,且實體類同時使用了自動填充,可能會導(dǎo)致沖突。解決辦法是在數(shù)據(jù)庫中移除默認值,完全依賴 MyBatis-Plus 進行自動填充。

4.2 MetaObjectHandler 必須注冊為 Spring Bean

自動填充處理器類 MetaObjectHandler 必須由 Spring 容器管理(即使用 @Component 注解),否則自動填充不會生效。

4.3 覆蓋已有值

在插入或更新時,MyBatis-Plus 會自動為標(biāo)注了 fill 的字段賦值,但如果這些字段已經(jīng)有值,則 MyBatis-Plus 默認不會覆蓋已有值

。要覆蓋已有值,可以使用 strictInsertFill 或 strictUpdateFill

5. 常見使用場景

5.1 創(chuàng)建時間和更新時間自動填充

在大多數(shù)數(shù)據(jù)庫表中,都會有 created_at 和 updated_at 字段,用于記錄數(shù)據(jù)的創(chuàng)建時間和最后更新時間。通過自動填充功能,MyBatis-Plus 可以輕松實現(xiàn)這兩個字段的自動維護。

5.2 操作人自動填充

在操作日志、審計系統(tǒng)等場景下,通常需要記錄操作人 ID??梢酝ㄟ^自動填充機制,在插入和更新記錄時,自動獲取當(dāng)前用戶 ID 并填充到表中。

@Override
public void insertFill(MetaObject metaObject) {
    this.strictInsertFill(metaObject, "operatorId", () -> getCurrentUserId(), Long.class);
}

6. 總結(jié)

MyBatis-Plus 的自動填充功能能夠極大地簡化開發(fā)工作,通過簡單的注解和配置即可實現(xiàn)插入、更新時的字段自動填充,減少了手動維護重復(fù)字段的代碼量。

  • @TableField(fill = ...):用于指定字段的自動填充策略,支持插入、更新和插入更新。
  • MetaObjectHandler:自定義自動填充邏輯的接口,開發(fā)者可以通過實現(xiàn) insertFill 和 updateFill 方法控制填充行為。

到此這篇關(guān)于MyBatis-Plus 自動填充的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)MyBatis-Plus 自動填充內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • java中構(gòu)造方法及this關(guān)鍵字的用法實例詳解(超詳細)

    java中構(gòu)造方法及this關(guān)鍵字的用法實例詳解(超詳細)

    大家都知道,java作為一門內(nèi)容豐富的編程語言,其中涉及的范圍是十分廣闊的,下面這篇文章主要給大家介紹了關(guān)于java中構(gòu)造方法及this關(guān)鍵字用法的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • JAXB命名空間及前綴_動力節(jié)點Java學(xué)院整理

    JAXB命名空間及前綴_動力節(jié)點Java學(xué)院整理

    這篇文章主要給大家介紹了關(guān)于JAXB命名空間及前綴的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • SpringBoot自動裝配原理以及分析

    SpringBoot自動裝配原理以及分析

    這篇文章主要介紹了SpringBoot自動裝配原理以及分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • java代碼規(guī)范review異常事故記錄

    java代碼規(guī)范review異常事故記錄

    這篇文章主要為大家介紹了java代碼規(guī)范關(guān)于異常review代碼發(fā)生異常的事故記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Spring事務(wù)失效的原因及解決方案

    Spring事務(wù)失效的原因及解決方案

    本文主要介紹了Spring事務(wù)失效的原因及解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • 詳解Spring簡單容器中的Bean基本加載過程

    詳解Spring簡單容器中的Bean基本加載過程

    本篇將對定義在 XMl 文件中的 bean,從靜態(tài)的的定義到變成可以使用的對象的過程,即 bean 的加載和獲取的過程進行一個整體的了解
    2017-05-05
  • Java并發(fā)編程之volatile變量介紹

    Java并發(fā)編程之volatile變量介紹

    這篇文章主要介紹了Java并發(fā)編程之volatile變量介紹,volatile提供了弱同步機制,用來確保將變量更新通知到其它線程,需要的朋友可以參考下
    2015-04-04
  • Java封裝數(shù)組實現(xiàn)在數(shù)組中查詢元素和修改元素操作示例

    Java封裝數(shù)組實現(xiàn)在數(shù)組中查詢元素和修改元素操作示例

    這篇文章主要介紹了Java封裝數(shù)組實現(xiàn)在數(shù)組中查詢元素和修改元素操作,結(jié)合實例形式分析了java針對數(shù)組元素查詢、修改的封裝操作實現(xiàn)技巧,需要的朋友可以參考下
    2020-03-03
  • Java讀取xml文件的五種方式

    Java讀取xml文件的五種方式

    在編寫與 XML 數(shù)據(jù)交互的現(xiàn)代軟件應(yīng)用時,有效地讀取和解析 XML 文件是至關(guān)重要的,本文旨在探討 Java 中處理 XML 文件的五種主要方法:DOM、SAX、StAX、JAXB 和 JDOM,我們將詳細介紹每種方法的工作原理、典型用途以及如何在 Java 程序中實現(xiàn)它們
    2024-05-05
  • IDEA Spring Boot 自動化構(gòu)建+部署的實現(xiàn)

    IDEA Spring Boot 自動化構(gòu)建+部署的實現(xiàn)

    這篇文章主要介紹了IDEA Spring Boot 自動化構(gòu)建+部署的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評論