You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 04:58:12