首页 > 解决方案 > MyBatis Mapper 使用 DB2 在一种方法中包含多个 SQL

问题描述

我需要在一个 MyBatis Mapper 方法中执行多个 SQL 语句,因为这些 SQL 是相互依赖的。使用 H2,这没问题:

    @Delete("DELETE FROM DETAIL_TABLE " +
        "      WHERE MASTER_ID IN " +
        "              (SELECT ID FROM MASTER WHERE BUSINESS_KEY = #{businessKey});" +
        "DELETE FROM MASTER " +
        "      WHERE BUSINESS_KEY = #{businessKey}; ")
void delete(@Param("businessKey") Integer businessKey);

当切换到 DB2 时,该语句不再起作用,因为 JDBC 驱动程序抛出以下异常:

Caused by: com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=?;DELETE FROM MASTER       WHERE;TAIL WHERE BUSINESS_KEY =;<space>, DRIVER=4.26.14

这只是一个简单的例子来演示这个问题。我知道您可以在所示情况下发送级联删除语句。

我读了一篇 StackOverflow 的帖子,说一些 JDBC 驱动程序不支持一次调用中的多个 SQL 语句,不推荐使用,但有时您需要按一定顺序执行不同的 SQL,因此定义多个 MyBatis 映射器方法并不能解决问题。

有谁知道如何实现这一目标?

标签: sqlannotationsdb2mybatismapper

解决方案


在 DB2 端,您可以运行复合语句

  "BEGIN ATOMIC" +
  "  DELETE FROM DETAIL_TABLE" +
  "        WHERE MASTER_ID IN" +
  "                (SELECT ID FROM MASTER WHERE BUSINESS_KEY = #{businessKey});" +
  "  DELETE FROM MASTER" +
  "        WHERE BUSINESS_KEY = #{businessKey};" +
  "END"

或创建并调用存储过程


推荐阅读