MyBatis批量更新列表时触发SQLSyntaxErrorException问题求助
问题排查与解决方案
核心原因
MySQL默认禁止在单个请求中执行多条SQL语句,你通过MyBatis foreach生成的多条UPDATE语句被MySQL判定为语法错误——即使设置了separator=";"也无法生效,因为JDBC连接未开启多语句支持。
解决方案一:开启JDBC多语句支持
修改你的数据库连接URL,添加allowMultiQueries=true参数:
# 示例配置 spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
如果已有其他参数,用&拼接即可。开启该参数后,MyBatis生成的多条带分号分隔的UPDATE语句就能正常执行。
解决方案二:改用单条SQL批量更新(推荐)
如果不想开启多语句支持,可以用CASE WHEN语法将批量更新合并为单条SQL,性能更优且无需修改连接配置:
<update id="updateComplianceCheckListResponse" parameterType="java.util.List"> UPDATE AM_ComplianceChecklistResponse SET complianceDetailsId = CASE id <foreach collection="list" item="response" separator=" "> WHEN #{response.id} THEN #{response.complianceDetailsId} </foreach> END, complianceChecklistId = CASE id <foreach collection="list" item="response" separator=" "> WHEN #{response.id} THEN #{response.complianceChecklistId} </foreach> END, questionResponse = CASE id <foreach collection="list" item="response" separator=" "> WHEN #{response.id} THEN #{response.questionResponse} </foreach> END, expiryDate = CASE id <foreach collection="list" item="response" separator=" "> WHEN #{response.id} THEN #{response.expiryDate} </foreach> END, documentName = CASE id <foreach collection="list" item="response" separator=" "> WHEN #{response.id} THEN #{response.documentName} </foreach> END, comments = CASE id <foreach collection="list" item="response" separator=" "> WHEN #{response.id} THEN #{response.comments} </foreach> END WHERE id IN <foreach collection="list" item="response" open="(" separator="," close=")"> #{response.id} </foreach> </update>
这种方式通过一次SQL请求完成所有更新,避免了多语句执行的限制,同时减少了数据库交互次数。
内容的提问来源于stack exchange,提问作者NIVESH D
相关产品推荐
相关产品推荐

