首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

MyBatis 動態 SQL 報錯「insert select 命令未結束」?一行配置解決 useGeneratedKeys 衝突

     編輯:Java 綜合教學

問題現象

在 MyBatis Mapper XML 中編寫 <insert> 語句,使用 <select> 子查詢插入數據時,啟動項目報錯:

org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: org.apache.ibatis.parsing.XPathParserException: ... insert select command not properly ended

根因分析

MyBatis 默認對 <insert> 啟用 useGeneratedKeys="true"(期望獲取自增主鍵)。但當 SQL 為 INSERT ... SELECT ... 形式時,JDBC 驅動**不支持**自動返回生成鍵,導致解析/執行階段衝突。

解決方案

在 <insert> 標籤顯式設置 useGeneratedKeys="false":

<insert id="batchInsertFromTemp" useGeneratedKeys="false">
    INSERT INTO target_table (col1, col2, create_time)
    SELECT col1, col2, NOW() FROM temp_table WHERE status = 1
</insert>

官方文檔說明

useGeneratedKeys(默認 false):設置為 true 時,會調用 JDBC 的 getGeneratedKeys() 獲取自增主鍵,**要求驅動兼容**。僅適用於 INSERT VALUES (..., ...) 形式,**不支持 INSERT SELECT**。

避坑檢查清單

  • ✅ 所有 INSERT ... SELECT ... 語句均設置 useGeneratedKeys="false"
  • ✅ 單條 INSERT VALUES 需獲取自增 ID 時,保持 useGeneratedKeys="true" + keyProperty="id"
  • ✅ 批量插入 foreach 時,若需回填 ID,確保數據庫/驅動支持批量生成鍵返回(MySQL 8.0+ 支持,PostgreSQL 需 RETURNING)

一行配置,秒解疑難雜症。記住:**INSERT SELECT 不能開啟 useGeneratedKeys**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved