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

MybatisPlus字段自動填充&樂觀鎖的方法實(shí)現(xiàn)

 更新時(shí)間:2025年08月14日 09:04:27   作者:y.q.q  
MyBatis-Plus提供了便捷的自動填充功能,可用于自動處理創(chuàng)建時(shí)間、更新時(shí)間等字段,本文來介紹一下MybatisPlus字段自動填充&樂觀鎖的方法實(shí)現(xiàn),感興趣的可以了解一下

MyBatis-Plus 提供了一個(gè)便捷的自動填充功能,用于在插入或更新數(shù)據(jù)時(shí)自動填充某些字段,如創(chuàng)建時(shí)間、更新時(shí)間等。

自動填充功能通過實(shí)現(xiàn) com.baomidou.mybatisplus.core.handlers.MetaObjectHandler 接口來實(shí)現(xiàn)。

1.使用步驟

1.定義實(shí)體類

@TableField(fill = FieldFill.INSERT):表示該字段在執(zhí)行 insert 操作時(shí)進(jìn)行填充。

@TableField(fill = FieldFill.INSERT_UPDATE):表示該字段在執(zhí)行 insert 和 update 操作時(shí)進(jìn)行填充。

LocalDateTime:這里使用 LocalDateTime 作為時(shí)間類型,也可以使用 Date 或 Instant 等

@Data
public class User {
    private Long id;
    private String name;
    @TableField(value = "pwd",select = false)
    private String password;
    private Integer age;
    private String tel;
    @TableField(exist = false)
    private String online;
    private Integer deleted;

    // 只在插入時(shí)自動填充字段
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime  createTime;

    // 在插入和更新時(shí)填充字
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    private String updateUser;
}

2.編寫填充處理器

創(chuàng)建一個(gè)類來實(shí)現(xiàn) MetaObjectHandler 接口,并重寫 insertFill 和 updateFill 方法。

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("開始插入填充...");
        // 創(chuàng)建時(shí)間字段只需要在創(chuàng)建這條記錄的時(shí)候填充當(dāng)前時(shí)間
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
        // 更新數(shù)據(jù)的人,在插入一條記錄的時(shí)候要把這個(gè)人記錄到數(shù)據(jù)庫
        this.strictInsertFill(metaObject, "updateUser", String.class, "admin");
        // 更新時(shí)間,在插入一條記錄的時(shí)候要把當(dāng)前時(shí)間記錄到數(shù)據(jù)庫
        this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("開始更新填充...");
        // 更新某條記錄的時(shí)候,把該記錄的更新的人記錄
        // this.strictUpdateFill(metaObject, "updateUser",String.class, "zhangsan");
        // 更新時(shí)間字段,在更新一條記錄的時(shí)候要把當(dāng)前時(shí)間記錄到數(shù)據(jù)庫
        // this.strictUpdateFill(metaObject, "updateTime",LocalDateTime.class, LocalDateTime.now());
        // this.strictUpdateFill(metaObject, "updateTime",LocalDateTime.class, LocalDateTime.now());
        this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
        this.setFieldValByName("updateUser", "zhangsan", metaObject);
    }
}

3.ID生成策略

  • id生成策略問題在實(shí)際工作中具備很強(qiáng)的現(xiàn)實(shí)意義。我們現(xiàn)在實(shí)驗(yàn)過程中數(shù)據(jù)庫的id直接用 數(shù)字1、2、3來寫,是非常危險(xiǎn)的,很容易被人“拖庫”,因此需要保證數(shù)據(jù)庫中的數(shù)據(jù)記錄 具備“無序性”。MP給我們提供了多種ID生成策略,可以在配置文件中配置這種策略。
  • “拖庫” 指的是攻擊者通過漏洞或非法手段獲取整個(gè)數(shù)據(jù)庫的完整備份(即“拖走數(shù)據(jù)庫”)。如果數(shù)據(jù)庫中的主鍵 ID 是連續(xù)的數(shù)字(如 1、2、3),攻擊者可以輕松遍歷所有記錄,批量爬取敏感數(shù)據(jù),甚至進(jìn)一步發(fā)起注入攻擊。因此,使用無序、非連續(xù)的 ID 生成策略是提升數(shù)據(jù)庫安全性的重要手段。
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
    # 主鍵自增
      id-type: auto
      # 表前綴
      table-prefix: tbl_
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0

4.測試代碼

1.testInsert():測試插入操作

  • 功能:向數(shù)據(jù)庫插入一條新的用戶記錄。

  • 關(guān)鍵點(diǎn)

    • 使用 userMapper.insert(user) 方法,直接傳入實(shí)體對象。

    • MyBatis-Plus 會自動生成主鍵(如配置了 @TableId 或全局主鍵策略)。

2.testUpdate():基于條件更新

  • 功能:根據(jù)條件更新指定字段。

  • 分析

    • 使用 UpdateWrapper 動態(tài)構(gòu)建更新條件。

    • userUpdateWrapper.set("name", "更887"):直接指定更新的字段名和值。

    • userUpdateWrapper.eq("id", "1916126238607409154"):通過 eq 方法設(shè)置 WHERE 條件。

    • 調(diào)用 userMapper.update(userUpdateWrapper) 執(zhí)行更新。

3.testUpdate1():基于實(shí)體主鍵更新

功能:先查詢后更新,通過實(shí)體主鍵更新記錄。

分析

  • 通過 userMapper.selectById("1916131310603149314") 查詢用戶。
  • 修改實(shí)體屬性后,調(diào)用 userMapper.updateById(user) 更新。
  • MyBatis-Plus 會根據(jù)實(shí)體中的 @TableId 自動生成 WHERE 條件(如 WHERE id = ?)。
  • 支持自動填充(如 updateTime 字段)。
 @Test
    public void testInsert() {
        User user = new User();
        user.setName("張99");
        user.setAge(19);
        user.setTel("123456789");
        user.setPassword("123456");
        int insert = userMapper.insert(user);
        System.out.println("insert:"+insert);
    }
    @Test
    public void testUpdate() {
        UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
        userUpdateWrapper.set("name", "更887");
        userUpdateWrapper.eq("id", "1916126238607409154");
        userMapper.update(userUpdateWrapper);
    }
    @Test
    public void testUpdate1() {
        User user = userMapper.selectById("1916131310603149314");
        // 假設(shè)ID為1的用戶存在
        user.setName("updatedUser");
        int result = userMapper.updateById(user);
        System.out.println("影響行數(shù):" + result);
        System.out.println("更新后的用戶更新時(shí)間:" + user.getUpdateTime());
    }

2.注意事項(xiàng)

  • 自動填充是直接給實(shí)體類的屬性設(shè)置值。
  • 如果屬性沒有值,入庫時(shí)會是 null。
  • MetaObjectHandler 提供的默認(rèn)方法策略是:如果屬性有值則不覆蓋,如果填充值為 null 則不填充。
  • 字段必須聲明 @TableField 注解,并設(shè)置 fill 屬性來選擇填充策略。
  • 填充處理器需要在 Spring Boot 中聲明為 @Component 或 @Bean。
  • 使用 strictInsertFill 或 strictUpdateFill 方法可以根據(jù)注解 FieldFill.xxx、字段名和字段類型來區(qū)分填充邏輯。
  • 如果不需區(qū)分,可以使用 fillStrategy 方法。
  • 在 update(T entity, Wrapper<T> updateWrapper) 時(shí),entity 不能為空,否則自動填充失效。
  • 在 update(Wrapper<T> updateWrapper) 時(shí)不會自動填充,需要手動賦值字段條件。

到此這篇關(guān)于MybatisPlus字段自動填充&樂觀鎖的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MybatisPlus字段自動填充&樂觀鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Eclipse最新版使用過程中遇到的問題總結(jié)

    Eclipse最新版使用過程中遇到的問題總結(jié)

    這篇文章主要介紹了Eclipse最新版使用過程中遇到的問題總結(jié)的相關(guān)資料,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • MyBatis-Plus?Page?分頁不生效的問題解決

    MyBatis-Plus?Page?分頁不生效的問題解決

    分頁是常見的一種功能,本文主要介紹了MyBatis-Plus?Page分頁不生效的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • 解決Idea報(bào)錯(cuò)There is not enough memory to perform the requested operation問題

    解決Idea報(bào)錯(cuò)There is not enough memory 

    在使用Idea開發(fā)過程中,可能會遇到因內(nèi)存不足導(dǎo)致的閃退問題,出現(xiàn)"There is not enough memory to perform the requested operation"錯(cuò)誤時(shí),可以通過調(diào)整Idea的虛擬機(jī)選項(xiàng)來解決,方法是在Idea的Help菜單中選擇Edit Custom VM Options
    2024-11-11
  • 淺談Java中Int、Integer、Integer.valueOf()、new Integer()之間的區(qū)別

    淺談Java中Int、Integer、Integer.valueOf()、new Integer()之間的區(qū)別

    本文主要介紹了淺談Java中Int、Integer、Integer.valueOf()、new Integer()之間的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • java圖形驗(yàn)證碼生成工具類 web頁面校驗(yàn)驗(yàn)證碼

    java圖形驗(yàn)證碼生成工具類 web頁面校驗(yàn)驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了java圖形驗(yàn)證碼生成工具類,web頁面校驗(yàn)驗(yàn)證碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 深入了解Spring中g(shù)etBean()的五種方式

    深入了解Spring中g(shù)etBean()的五種方式

    在本文中,我們將詳細(xì)介紹從BeanFactory中獲取bean的多種方式。簡單地說,正如方法的名稱所表達(dá)的,getBean()負(fù)責(zé)從Spring?IOC容器中獲取bean實(shí)例,希望對大家有所幫助
    2023-02-02
  • SpringBoot2.7?WebSecurityConfigurerAdapter類過期配置

    SpringBoot2.7?WebSecurityConfigurerAdapter類過期配置

    這篇文章主要為大家介紹了SpringBoot2.7中WebSecurityConfigurerAdapter類過期應(yīng)該如何配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Spring Boot 2.x基礎(chǔ)教程之配置元數(shù)據(jù)的應(yīng)用

    Spring Boot 2.x基礎(chǔ)教程之配置元數(shù)據(jù)的應(yīng)用

    這篇文章主要介紹了Spring Boot 2.x基礎(chǔ)教程之配置元數(shù)據(jù)的應(yīng)用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Java全面解析ttf字體的信息

    Java全面解析ttf字體的信息

    文章介紹了Java如何解析TTF字體文件,提取字體的基本信息、版本信息、版權(quán)和許可證、字符映射以及各種表格信息,通過代碼解析,可以獲取字體的詳細(xì)描述和度量數(shù)據(jù)
    2025-01-01
  • spring配置文件加密方法示例

    spring配置文件加密方法示例

    這篇文章主要介紹了spring配置文件加密方法示例,簡單介紹了什么是配置文件,然后分享了在實(shí)際生產(chǎn)環(huán)境中,對配置文件不允許出現(xiàn)明文用戶名及密碼等信息需求的Java實(shí)現(xiàn)代碼,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11

最新評論

潜山县| 报价| 剑川县| 固始县| 剑阁县| 牟定县| 明光市| 江门市| 桑植县| 石门县| 聂拉木县| 高阳县| 宁武县| 太仆寺旗| 浑源县| 嘉黎县| 昌江| 武功县| 彭水| 惠来县| 江津市| 文成县| 鹿泉市| 资溪县| 金阳县| 夏津县| 西吉县| 大渡口区| 澜沧| 含山县| 梓潼县| 会宁县| 蛟河市| 广平县| 岳西县| 南丰县| 常宁市| 荆州市| 天峻县| 庆城县| 德阳市|