MyBatis一次执行多个sql语句,这可能吗?

2022-09-02 19:48:05

我想知道是否可以在1 go中执行多个sql语句。例如,我想从多个表中删除行的场景,是否有一种方法可以做这样的事情。

<delete id="delete" parameterType="String">
    DELETE FROM DUMMYTABLE_A where X=${value}
    DELETE FROM DUMMYTABLE_B where X=${value}
</delete>

答案 1

我正在将myBatis与Oracle一起使用。我想在其他数据库也有类似的东西。实际上,当您必须支持项目时,您始终可以在DB中创建过程,这通常对未来更好。

<delete id="deleteUnfinishedData" parameterType="map">
    {call
        declare
        begin
            delete from TABLE1 where id = #{valueFromMap1};
            delete from TABLE2 where id = #{valueFromMap2};
        end
    }
</delete>

答案 2

是的,大多数数据库都允许这样做。通常,您必须用某些东西来分隔 SQL 语句。在PostGRES和MySQL中,它是一个分号(;)。在Microsoft SQL Server中,您应该使用关键字GO。[ 2013 年 5 月更新:从 SQL Server 2012 开始,您可以并且应该使用分号来分隔语句。在SQL Server 2012(即下一个版本及更高版本)之后,这些将是强制性的。使用GO现在是在SQL2012及以后的不推荐使用的方式)。]

MySQL / PostGRES 示例:

 DELETE FROM DUMMYTABLE_A where X=${value};
 DELETE FROM DUMMYTABLE_B where X=${value};
 DELETE FROM DUMMYTABLE_C where X=${value};

MS-SQL 示例:

 DELETE FROM DUMMYTABLE_A where X=${value}
 GO
 DELETE FROM DUMMYTABLE_B where X=${value}
 GO
 DELETE FROM DUMMYTABLE_C where X=${value}

更好的数据库(即不是MySQL)也将支持使用 BEGIN TRAN / COMMIT TRAN / ROLLBACK TRAN 的事务。使用事务,您实际上可以将所有语句批处理为一个原子操作,如果其中一部分失败,则所有三个语句都将回滚。有关这些内容的详细信息,请参阅 http://www.sqlteam.com/article/introduction-to-transactions

最有可能的是,您所需要的只是SQL语句之间的分号!


推荐