Java + Spring Boot + Mybatis 插入數據后,獲取自增 id 的方法

在 MyBatis 中使用?useGeneratedKeys="true"?獲取新插入記錄的自增 ID 值,可通過以下步驟實現:

1.?配置 Mapper XML

在插入語句的?<insert>?標簽中設置:

xml

復制

下載

運行

<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">INSERT INTO user(name, email)VALUES (#{name}, #{email})
</insert>
  • useGeneratedKeys="true":啟用數據庫生成的主鍵(如自增 ID)。

  • keyProperty="id":將生成的主鍵值賦給參數對象(如?User?對象)的?id?屬性。


2.?定義實體類

確保實體類有對應的屬性(與?keyProperty?一致):

java

復制

下載

public class User {private Long id; // 屬性名必須與 keyProperty 匹配private String name;private String email;// Getter & Setter
}

3.?調用 Mapper 方法

插入后,自動填充的 ID 會直接賦給傳入的實體對象:

java

復制

下載

User newUser = new User();
newUser.setName("John");
newUser.setEmail("john@example.com");// 執行插入(返回的是影響行數,非 ID)
int rows = userMapper.insertUser(newUser); // 插入后,自增 ID 已注入 newUser 的 id 屬性
Long newId = newUser.getId(); // ? 直接獲取
System.out.println("新記錄的 ID:" + newId);

關鍵點說明

  1. keyProperty?必須匹配實體屬性名
    如實體屬性為?userId,則需配置?keyProperty="userId"

  2. 支持批量插入(MyBatis 3.3.1+)
    配置?keyProperty?為集合元素的屬性:

    xml

    復制

    下載

    運行

    <insert id="insertUsers" useGeneratedKeys="true" keyProperty="id">INSERT INTO user(name) VALUES <foreach collection="list" item="user" separator=",">(#{user.name})</foreach>
    </insert>

    調用后,每個對象的?id?都會被賦值:

    java

    復制

    下載

    List<User> users = Arrays.asList(new User("A"), new User("B"));
    userMapper.insertUsers(users);
    users.forEach(u -> System.out.println(u.getId())); // 輸出所有新 ID
  3. 數據庫兼容性

    • MySQL/SQL Server:直接支持?useGeneratedKeys

    • Oracle:需用?<selectKey>?配合序列(非本方案范疇)。


常見問題

  • 獲取值為?null
    檢查?keyProperty?是否與實體屬性名一致,或數據庫是否真的生成了自增 ID。

  • 批量插入無效?
    確保 MyBatis 版本 ≥ 3.3.1,且?keyProperty?指向集合元素的屬性(如?id)。

通過此方案,插入后無需額外查詢,ID 值直接注入對象屬性,高效簡潔。

在 MyBatis 中,keyProperty?可以指定為參數對象中的任意屬性路徑(包括嵌套對象或 Map 的鍵值),不一定必須是主實體對象的屬性。以下是幾種靈活用法:


1. 指定參數對象的嵌套屬性

若參數是一個包含 ID 容器的復合對象:

java

復制

下載

public class InsertParam {private User user;private Long generatedId; // 專門接收 ID 的屬性// Getter & Setter
}

Mapper XML 配置:

xml

復制

下載

運行

<insert id="insertUser" parameterType="InsertParam" useGeneratedKeys="true" keyProperty="generatedId">INSERT INTO user(name) VALUES (#{user.name})
</insert>

插入后獲取:

java

復制

下載

InsertParam param = new InsertParam();
param.setUser(new User("Alice"));
userMapper.insertUser(param);Long newId = param.getGeneratedId(); // ? 從專用屬性獲取

2. 使用?Map?參數接收

直接通過 Map 傳遞參數并接收 ID:

xml

復制

下載

運行

<insert id="insertUser" parameterType="map"useGeneratedKeys="true" keyProperty="resultId">INSERT INTO user(name) VALUES (#{name})
</insert>

Java 調用:

java

復制

下載

Map<String, Object> params = new HashMap<>();
params.put("name", "Bob");userMapper.insertUser(params);Long newId = (Long) params.get("resultId"); // ? 從 Map 獲取

3. 多參數場景(結合?@Param

當方法有多個參數時,用?@Param?指定命名空間:

java

復制

下載

int insertUser(@Param("user") User user,@Param("idHolder") Map<String, Long> idHolder // 專門存 ID 的 Map
);

Mapper XML 配置:

xml

復制

下載

運行

<insert id="insertUser" useGeneratedKeys="true" keyProperty="idHolder.id">INSERT INTO user(name) VALUES (#{user.name})
</insert>

插入后獲取:

java

復制

下載

Map<String, Long> idHolder = new HashMap<>();
User user = new User("Charlie");userMapper.insertUser(user, idHolder);Long newId = idHolder.get("id"); // ? 從獨立 Map 獲取

關鍵規則

  1. 路徑匹配原則
    keyProperty?的值是 OGNL 表達式,需嚴格匹配參數對象的屬性路徑:

    • 單參數:直接寫屬性名(如?generatedId

    • 多參數:用?@Param?別名前綴(如?idHolder.id

  2. 批量插入場景
    批量操作時?keyProperty?需指向集合元素的屬性(不支持外部容器):

    xml

    復制

    下載

    運行

    <!-- 正確:ID 注入到每個元素的 id 屬性 -->
    <insert id="batchInsert" useGeneratedKeys="true" keyProperty="id">INSERT INTO user(name) VALUES <foreach item="item" collection="list" separator=",">(#{item.name})</foreach>
    </insert>
  3. 常見問題

    • 屬性未注入??檢查?keyProperty?路徑是否存在 setter 方法

    • 返回?null?確保數據庫自增 ID 已生效(如 MySQL 的?AUTO_INCREMENT


使用建議

  • 專用 ID 容器:推薦用獨立?Map?或 DTO 屬性接收 ID,避免污染實體對象

  • 明確路徑:多參數時用?@Param?定義清晰命名空間(如?keyProperty="holder.id"

  • 事務安全:插入后立即從參數對象中獲取 ID,確保在同一事務內

當 Mapper 方法有多個參數時,MyBatis 無法確定將生成的自增 ID 注入到哪個參數中。以下是詳細解決方案:

錯誤原因分析

復制

下載

Cause: org.apache.ibatis.executor.ExecutorException: 
Could not determine which parameter to assign generated keys to.
Note that when there are multiple parameters, 'keyProperty' must include the parameter name
  • 當 Mapper 方法有多個參數時,必須使用?參數名前綴?明確指定注入位置

  • 您當前配置的?keyProperty="generatedId"?缺少參數名前綴

  • MyBatis 找到的可用參數:[generatedId, ckDetailId, param1, param2]


解決方案:添加參數名前綴

方法 1:使用?@Param?注解明確命名參數

java

復制

下載

// Mapper 接口方法
int insertRecord(@Param("data") Map<String, Object> data,       // 數據參數@Param("idHolder") Map<String, Long> idHolder  // 專門接收ID的參數
);

xml

復制

下載

運行

<!-- Mapper XML 配置 -->
<insert id="insertRecord" useGeneratedKeys="true" keyProperty="idHolder.generatedId">  <!-- 添加參數名前綴 -->INSERT INTO your_table(...) VALUES (#{data.field1}, #{data.field2})
</insert>
方法 2:使用 MyBatis 默認參數名(不推薦)

xml

復制

下載

運行

<insert id="insertRecord" useGeneratedKeys="true" keyProperty="param2.generatedId">  <!-- 使用paramN格式 -->...
</insert>

參數索引從1開始:param1=第一個參數,?param2=第二個參數


完整示例代碼

1. Mapper 接口

java

復制

下載

public interface YourMapper {int insertRecord(@Param("detail") YourEntity entity,         // 實體參數@Param("idHolder") Map<String, Long> holder // ID容器參數);
}
2. Mapper XML

xml

復制

下載

運行

<insert id="insertRecord" useGeneratedKeys="true"keyProperty="idHolder.generatedId">  <!-- 關鍵:帶前綴的keyProperty -->INSERT INTO your_table(name, ck_detail_id)VALUES (#{detail.name}, #{detail.ckDetailId})
</insert>
3. 調用代碼

java

復制

下載

// 準備參數
YourEntity entity = new YourEntity("test", 1001);
Map<String, Long> idHolder = new HashMap<>();  // 專門接收ID// 執行插入
mapper.insertRecord(entity, idHolder); // 獲取自增ID (注意鍵名與XML中一致)
Long newId = idHolder.get("generatedId"); 
System.out.println("Generated ID: " + newId);

關鍵注意事項

  1. 前綴必須匹配?@Param?值
    keyProperty="idHolder.generatedId"?對應:

    • idHolder?→?@Param("idHolder")

    • generatedId?→ Map中的鍵名

  2. Map 接收 vs 對象屬性

    xml

    復制

    下載

    運行

    <!-- 如果使用對象屬性接收 -->
    keyProperty="detail.id"  <!-- 注入到實體對象的id屬性 --><!-- 如果使用Map接收 -->
    keyProperty="idHolder.generatedId"  <!-- 注入到Map的generatedId鍵 -->
  3. 批量插入特殊處理
    批量操作時仍需注入到集合元素內:

    xml

    復制

    下載

    運行

    <insert id="batchInsert" useGeneratedKeys="true" keyProperty="id">INSERT ... <!-- 無法注入到外部參數 -->
    </insert>

常見錯誤排查

錯誤現象解決方案
返回null檢查數據庫自增列是否生效
Invalid bound statement檢查keyProperty前綴是否匹配@Param
批量插入ID未注入確保keyProperty指向集合元素的屬性
Oracle數據庫不生效需使用<selectKey>替代

建議:對多參數場景始終使用?@Param?+ 前綴的?keyProperty,避免依賴?paramN?隱式命名

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83463.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83463.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83463.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Meta發布V-JEPA 2世界模型及物理推理新基準,推動AI在物理世界中的認知與規劃能力

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

觸覺智能RK3576核心板工業應用之軟硬件全國產化,成功適配開源鴻蒙OpenHarmony5.0

在全球科技競爭加劇和供應鏈安全日益重要的背景下&#xff0c;實現關鍵軟硬件的全國產化替代已成為國家戰略和產業共識。在這一背景下&#xff0c;觸覺智能推出RK3576核心板,率先適配開源鴻蒙OpenHarmony5.0操作系統&#xff0c;真正實現了從芯片到操作系統的全棧國產化方案&am…

前端基礎知識ES6系列 - 01(var、let、const之間的區別)

一、var 在ES5中&#xff0c;頂層對象的屬性和全局變量是等價的&#xff0c;用var聲明的變量既是全局變量&#xff0c;也是頂層變量 注意&#xff1a;頂層對象&#xff0c;在瀏覽器環境指的是window對象&#xff0c;在 Node 指的是global對象 var a 10; console.log(window…

Python Docker 鏡像構建完整指南:從基礎到優化

Python 是一門廣泛使用的編程語言,在容器化環境中,構建和使用 Python 鏡像是非常常見的任務。本文將提供一個完整的指南,包括選擇基礎鏡像、制作流程、不同場景下的應用、安全性最佳實踐以及鏡像優化策略。 1. 選擇合適的基礎鏡像 1.1 官方 Python 鏡像 Docker Hub 提供了…

【狂飆AGI】第1課:大模型概述

目錄 &#xff08;一&#xff09;大模型概念解析&#xff08;二&#xff09;大模型發展歷程&#xff08;三&#xff09;大模型發展現狀&#xff08;1&#xff09;OpenAI&#xff08;2&#xff09;微軟&#xff08;3&#xff09;谷歌&#xff08;4&#xff09;Meta &#xff08;…

vite ts 配置使用@ 允許js

1.vite.config.ts 配置 import { defineConfig } from vite import vue from vitejs/plugin-vue import { fileURLToPath, URL } from node:url import setup_extend from vite-plugin-vue-setup-extend// https://vite.dev/config/ export default defineConfig({plugins: …

使用Ollama+open-webui搭建本地AI模型

本地搭建AI模型 說明&#xff1a;1、下載Ollama2、下載模型3、pip安裝open-webui&#xff08;不推薦&#xff09;1、Python版本不對應2、下載wheels失敗 4、docker安裝open-webui 說明&#xff1a; 在windows上搭建本地AI&#xff0c;使用Ollamaopen-webui的方式&#xff0c;可…

第 87 場周賽:比較含退格的字符串、數組中的最長山脈、一手順子、訪問所有節點的最短路徑

Q1、[簡單] 比較含退格的字符串 1、題目描述 給定 s 和 t 兩個字符串&#xff0c;當它們分別被輸入到空白的文本編輯器后&#xff0c;如果兩者相等&#xff0c;返回 true 。# 代表退格字符。 **注意&#xff1a;**如果對空文本輸入退格字符&#xff0c;文本繼續為空。 示例 …

linux安裝阿里DataX實現數據遷移

目錄 下載datax工具包(如果下載慢&#xff0c;請嘗試其他國內鏡像站或其他網站下載相應資源) 解壓工具包到當前目錄里 接著進入conf配置目錄并創建一個myjob.json&#xff08;臨時測試json&#xff09;&#xff0c;myjob.json內容如下&#xff0c;用于模擬test庫tab1表數據同…

C++ 引用介紹

很好&#xff01;既然你有 C 的基礎&#xff0c;那么理解 C 的「引用&#xff08;reference&#xff09;」會容易很多。我們來一步步講清楚這個概念。 &#x1f31f; 一句話總結&#xff1a; C 引用&#xff08;reference&#xff09;就是已存在變量的“別名”&#xff0c;它不…

學習筆記086——@PostConstruct注解和InitializingBean接口的使用

文章目錄 1、PostConstruct注解1.1 介紹1.2 用法1.3 場景 2、InitializingBean接口2.1 介紹2.2 用法 1、PostConstruct注解 1.1 介紹 PostConstruct 是 Java EE/Jakarta EE 中的一個注解&#xff0c;用于標記一個方法在依賴注入完成后執行初始化操作。它通常與 Spring 框架一…

考研系列—408真題操作系統篇(2015-2019)

目錄 # 2015年 1.死鎖處理 (1)預防死鎖 (2)避免死鎖 (3)死鎖檢測和解除 2.請求分頁系統的頁面置換策略、頁面置換策略 3.頁、頁框、頁表,基本分頁系統 # 2016年 1.異常、中斷 2.頁置換算法 3.進程的互斥操作 4.SPOOLing技術(從軟件方面實現設備共享) 5.一定要牢記…

argocd部署cli工具并添加k8s集群

先決條件: 1.已經有k8s集群,(網上一萬種部署方式,這里我使用的是kubekey部署的),也埋了個坑,后面說明. 2.已經部署好argocd,并驗證web已經可以訪問.參見 k8s部署argocd-CSDN博客 部署客戶端工具, 這里我是從web頁面上直接下載的對應版本的cli工具. 打開已經部署好的argoc…

打卡day52

簡單cnn 借助調參指南進一步提高精度 基礎CNN模型代碼 import tensorflow as tf from tensorflow.keras import layers, models from tensorflow.keras.datasets import cifar10 from tensorflow.keras.utils import to_categorical# 加載數據 (train_images, train_labels),…

OpenGL ES繪制3D圖形以及設置視口

文章目錄 關于 glDrawElements基本概念使用場景mode 繪制模式type 索引數據類型indices 索引緩沖區工作原理繪制正方體實例 視口透視投影&#xff08;Perspective Projection&#xff09;正交投影&#xff08;Orthographic Projection&#xff09;正交投影和透視投影對比 關于 …

【SAS求解多元回歸方程】REG多元回歸分析-多元一次回歸

多元一次回歸是一種統計方法&#xff0c;用于分析多個自變量&#xff08;解釋變量&#xff09;與一個因變量&#xff08;響應變量&#xff09;之間的線性關系。 目錄 【示例】 基本語法 SAS代碼 參數估計 方差分析 回歸統計量 y的擬合診斷 y的回歸變量值 【示例】 設Y…

卡通幼兒園教育通用可愛PPT模版分享

幼兒園教育通用PPT模版&#xff0c;教育教學PPT模版&#xff0c;卡通教育PPT模版&#xff0c;可愛卡通教學課件PPT模版&#xff0c;小清新動物卡通通用PPT模版&#xff0c;教學說課通用PPT模版&#xff0c;開學季PPT模版&#xff0c;國學頌歌PPT模版&#xff0c;可愛簡約風PPT模…

力扣HOT100之技巧:75. 顏色分類

這道題實際上就是讓我們不用sort()函數來實現對原數組的排序&#xff0c;這里我直接使用快速排序對原數組進行排序了&#xff0c;也是復習一下基于快慢指針的快速排序寫法。面試手撕快排的思路參考這個視頻。 用時擊敗100%&#xff0c;還行。下面直接貼代碼。 class Solution …

離線部署openstack 2024.1 keystone

控制節點身份服務 離線下載 apt-get install --download-only keystone python3-openstackclient apache2 libapache2-mod-wsgi-py3mkdir /controller/keystone mv /var/cache/apt/archives/*.deb /controller/keystone/ dpkg -i /controller/keystone/*.deb在一個控制節點操…

帆軟 BI 從入門到實戰全攻略(一):安裝激活與添加數據

一、帆軟 BI 產品概述? 在當今大數據時代&#xff0c;數據分析與可視化成為企業洞察業務、驅動決策的關鍵利器。帆軟軟件有限公司作為中國專業的大數據 BI 和分析平臺提供商&#xff0c;自 2006 年成立以來&#xff0c;憑借其在商業智能和數據分析領域的深耕細作&#xff0c;…