在 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**。