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

问题描述 投票:16回答:3

我想知道是否有可能在1 go中执行多个sql语句。例如,我想从多个表中删除行的场景,有没有办法可以做的事情,比如...

<delete id="delete" parameterType="String">
    DELETE FROM DUMMYTABLE_A where X=${value}
    DELETE FROM DUMMYTABLE_B where X=${value}
</delete>
java sql jdbc mybatis mapper
3个回答
15
投票

是的,大多数数据库允许这样做通常,您必须使用某些内容来划分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语句之间的分号!


22
投票

我正在使用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>

0
投票

如果有人得到像这样的错误

原因:java.sql.SQLSyntaxErrorException:您的SQL语法中有错误;检查与您的MariaDB服务器版本对应的手册,以便在'UPDATE mytable附近使用正确的语法

您可以通过在驱动程序中允许多个查询来解决此问题。对于mariadb,它将与MySQL相同

allowMultiQuery =真

在下面mybatis问题https://github.com/mybatis/mybatis-3/issues/1497中描述

© www.soinside.com 2019 - 2024. All rights reserved.