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

Mybatis-Plus save和saveBatch方法忽略自增主鍵詳解

 更新時間:2025年12月15日 08:45:15   作者:duchx  
Mybatis-Plus在從3.4.0升級到3.5.6后,save和saveBatch方法在處理自增主鍵時會出現(xiàn)主鍵沖突的問題,這是因為3.5.6版本中增加了`ignoreAutoIncrementColumn`屬性,默認值為false,導致在生成SQL語句時忽略了自增主鍵,解決方法是手動設(shè)置主鍵值

Mybatis-Plus save和saveBatch方法忽略自增主鍵

這個mybatisplus版本從3.4.0升級到3.5.6之后原來涉及到save和saveBatch方法的地方會報主鍵沖突

org.springframework.dao.DuplicateKeyException:
### Error updating database.  Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '*' for key '*****.PRIMARY'

各大搜索引擎搜索了一圈,都沒有關(guān)于這個問題的答案,于是只能跟蹤mybatisplus代碼進去一探究竟

在MybatisPlusAutoConfiguration創(chuàng)建SqlSessionFactory對象后會

從跟蹤情況得知sql語句的生成是在服務(wù)啟動的時候就加載生成了的。

在MybatisConfiguration類中創(chuàng)建SqlSessionFactory對象

創(chuàng)建過程中遍歷mapperLocations使用MybatisXMLMapperBuilder對Mapper文件進行解析,中間步驟跳過,因為我們跟蹤的是save和saveBatch這兩個方法最終調(diào)用的是Mapper.insert方法,所以只需看Insert類即可,上面解析方法為insert通過Insert類來完成

public class Insert extends AbstractMethod {
    private boolean ignoreAutoIncrementColumn;

    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        KeyGenerator keyGenerator = NoKeyGenerator.INSTANCE;
        SqlMethod sqlMethod = SqlMethod.INSERT_ONE;
        String columnScript = SqlScriptUtils.convertTrim(tableInfo.getAllInsertSqlColumnMaybeIf((String)null, this.ignoreAutoIncrementColumn), "(", ")", (String)null, ",");
        String valuesScript = "(\n" + SqlScriptUtils.convertTrim(tableInfo.getAllInsertSqlPropertyMaybeIf((String)null, this.ignoreAutoIncrementColumn), (String)null, (String)null, (String)null, ",") + "\n" + ")";
        String keyProperty = null;
        String keyColumn = null;
        if (StringUtils.isNotBlank(tableInfo.getKeyProperty())) {
            if (tableInfo.getIdType() == IdType.AUTO) {
                keyGenerator = Jdbc3KeyGenerator.INSTANCE;
                keyProperty = tableInfo.getKeyProperty();
                keyColumn = SqlInjectionUtils.removeEscapeCharacter(tableInfo.getKeyColumn());
            } else if (null != tableInfo.getKeySequence()) {
                keyGenerator = TableInfoHelper.genKeyGenerator(this.methodName, tableInfo, this.builderAssistant);
                keyProperty = tableInfo.getKeyProperty();
                keyColumn = tableInfo.getKeyColumn();
            }
        }

        String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), columnScript, valuesScript);
        SqlSource sqlSource = super.createSqlSource(this.configuration, sql, modelClass);
        return this.addInsertMappedStatement(mapperClass, modelClass, this.methodName, sqlSource, (KeyGenerator)keyGenerator, keyProperty, keyColumn);
    }
}

這個類代碼不多,只有一個方法injectMappedStatement,關(guān)鍵代碼就在這個方法的columnScript變量賦值上面getAllInsertSqlColumnMaybeIf((String)null, this.ignoreAutoIncrementColumn)
這個方法有個傳參ignoreAutoIncrementColumn,是Insert類的成員變量

這個值的默認值是false,在3.4.0的版本中是沒有的

3.4.0的版本代碼

public class Insert extends AbstractMethod {
    public Insert() {
    }

    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        KeyGenerator keyGenerator = new NoKeyGenerator();
        SqlMethod sqlMethod = SqlMethod.INSERT_ONE;
        String columnScript = SqlScriptUtils.convertTrim(tableInfo.getAllInsertSqlColumnMaybeIf((String)null), "(", ")", (String)null, ",");
        String valuesScript = SqlScriptUtils.convertTrim(tableInfo.getAllInsertSqlPropertyMaybeIf((String)null), "(", ")", (String)null, ",");
        String keyProperty = null;
        String keyColumn = null;
        if (StringUtils.isNotBlank(tableInfo.getKeyProperty())) {
            if (tableInfo.getIdType() == IdType.AUTO) {
                keyGenerator = new Jdbc3KeyGenerator();
                keyProperty = tableInfo.getKeyProperty();
                keyColumn = tableInfo.getKeyColumn();
            } else if (null != tableInfo.getKeySequence()) {
                keyGenerator = TableInfoHelper.genKeyGenerator(this.getMethod(sqlMethod), tableInfo, this.builderAssistant);
                keyProperty = tableInfo.getKeyProperty();
                keyColumn = tableInfo.getKeyColumn();
            }
        }

        String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), columnScript, valuesScript);
        SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass);
        return this.addInsertMappedStatement(mapperClass, modelClass, this.getMethod(sqlMethod), sqlSource, (KeyGenerator)keyGenerator, keyProperty, keyColumn);
    }
}

比3.5.6就少了這個屬性,而columnScript賦值的后面方法中如果主鍵策略是IdType.AUTO也就是自增主鍵的話默認是不帶主鍵返回的

所以如果3.4.0的版本用了save或saveBatch方法并且?guī)Я酥麈I值升級為3.5.6后需要手動設(shè)置

mybatis-plus.global-config.db-config.insertIgnoreAutoIncrementColumn=true

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java 回調(diào)機制(CallBack) 詳解及實例代碼

    Java 回調(diào)機制(CallBack) 詳解及實例代碼

    這篇文章主要介紹了 Java 回調(diào)機制(CallBack) 詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Java實現(xiàn)上傳和下載功能(支持多個文件同時上傳)

    Java實現(xiàn)上傳和下載功能(支持多個文件同時上傳)

    這篇文章主要介紹了Java實現(xiàn)上傳和下載功能,支持多個文件同時上傳,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 抽象類使用Jackson序列化問題

    抽象類使用Jackson序列化問題

    這篇文章主要介紹了抽象類使用Jackson序列化問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Java執(zhí)行shell命令的實現(xiàn)

    Java執(zhí)行shell命令的實現(xiàn)

    本文主要介紹了Java執(zhí)行shell命令的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • Mybatis-Plus自動生成id涉及的問題解決過程

    Mybatis-Plus自動生成id涉及的問題解決過程

    文章主要講述了解決用戶ID在頁面和數(shù)據(jù)庫中不一致的問題,并提供了兩種解決方案:將主鍵類型改為String或刪除數(shù)據(jù)庫表重新創(chuàng)建以清空最大id
    2025-12-12
  • Java的垃圾回收機制實例分析

    Java的垃圾回收機制實例分析

    這篇文章主要介紹了Java的垃圾回收機制,結(jié)合實例形式分析了垃圾回收機制的原理及相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08
  • java中獲取hashmap中的所有key方式

    java中獲取hashmap中的所有key方式

    這篇文章主要介紹了java中獲取hashmap中的所有key方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • springmvc中進行數(shù)據(jù)保存以及日期參數(shù)的保存過程解析

    springmvc中進行數(shù)據(jù)保存以及日期參數(shù)的保存過程解析

    這篇文章主要介紹了springmvc中進行數(shù)據(jù)保存以及日期參數(shù)的保存過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • Java程序員應該遵守的10條紀律

    Java程序員應該遵守的10條紀律

    Java程序員有許多應遵循的守則或最佳實踐方式。本文概述了每個開發(fā)者最應該遵循的10條守則或戒律,如果不遵循它們,將會導致災難性后果。
    2015-09-09
  • 解釋為什么Java中“1000==1000”為false而”100==100“為true

    解釋為什么Java中“1000==1000”為false而”100==100“為true

    在日常編程中,我們經(jīng)常遇到一些看似簡單卻隱藏著復雜邏輯的問題,這篇文章主要介紹了解釋為什么Java中“1000==1000”為false而”100==100“為true,需要的朋友可以參考下
    2024-01-01

最新評論

南部县| 杭锦旗| 宝坻区| 麦盖提县| 西和县| 闽侯县| 庐江县| 广昌县| 西乌珠穆沁旗| 定襄县| 江华| 柳江县| 安吉县| 苍南县| 临高县| 志丹县| 闸北区| 炉霍县| 漾濞| 兴隆县| 福安市| 罗定市| 铜梁县| 汨罗市| 建阳市| 扎赉特旗| 闵行区| 淳安县| 大宁县| 门源| 四川省| 贵溪市| 青铜峡市| 玉门市| 岳西县| 彰武县| 萨嘎县| 台山市| 米易县| 高平市| 淮滨县|