我想知道是否可以一次执行多个 sql 语句。例如,我想从多个表中删除行的场景,有没有办法可以做类似的事情。
<delete id="delete" parameterType="String">
DELETE FROM DUMMYTABLE_A where X=${value}
DELETE FROM DUMMYTABLE_B where X=${value}
</delete>
我将 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>
是的,大多数数据库都允许这样做。通常你必须用一些东西来界定你的 SQL 语句。在 PostGRES 和 MySQL 中,它是一个分号 (;)。在 Microsoft SQL Server 中,您应该使用关键字 GO。[ 2013 年 5 月更新:从 SQL Server 2012 开始,您可以并且应该使用分号来分隔语句。在 SQL Server 2012(即下一版本及更高版本)之后,这些将是强制性的。在 SQL2012 及以后的版本中,使用 GO 现在已被弃用)。]
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 语句之间的分号!
如果有人遇到类似的错误
原因:java.sql.SQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以获取在“UPDATE mytable”附近使用的正确语法
您可以通过在驱动程序中允许多个查询来解决此问题。对于 mariadb,它将与 MySQL 相同
allowMultiQuery=true
在以下 mybatis 问题中描述 https://github.com/mybatis/mybatis-3/issues/1497