MyBatis能否一次执行多个SQL语句?

18

我想知道是否有可能一次执行多个SQL语句。 例如,我想从多个表中删除行,有办法可以这样做吗?

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

25

我正在使用myBatis和Oracle。我猜其他数据库中也有类似的东西。实际上,您总是可以在数据库中创建过程,这通常对于未来支持项目更好。

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

1
Oracle在这个领域是一个特别的怪兽。感谢演示这个例子,正是我今天需要的。 - Marc
非常顺利地完成了工作。谢谢! - Joseph Lust
这个怎么修改才能适用于SQL Server? - SMKS

18

是的,大多数数据库都允许这样做。通常您需要用一些符号来分隔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语句之间加上分号就可以了!

1
我不知道,但这对我不起作用。我附上下一个要点 https://gist.github.com/AdelinGhanaem/b565ca3a447e89087ab7 你可以看到它没有像回滚一样用“query”分开两个语句... - Adelin
3
我尝试了这种方法,但是MyBatis抛出了一个异常。问题在于我没有在JDBC URL中设置allowMultiQueries=true标志。谢谢。 - Ye Kyaw Kyaw Htoo
这对我也不起作用,我正在尝试通过“in”条件删除两批数据,但是我得到了SQL语法语法错误。 - Saorikido
1
问题在于我没有在JDBC URL中设置allowMultiQueries=true标志。https://dev59.com/p37aa4cB1Zd3GeqPwOZt - Med-Salah OKA

1
如果出现以下错误:
“Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'UPDATE mytable”
你可以通过在驱动程序中允许多个查询来解决此问题。对于Mariadb,它与MySQL相同。
allowMultiQuery=true 在以下Mybatis问题中描述了此内容 https://github.com/mybatis/mybatis-3/issues/1497

0

以下代码适用于在 MSSQL 中一次性处理多个 Select

<select id="selectMultipleQueries" resultSets="movies,genres" resultMap="multipleQueriesResult">
        BEGIN
            select M.ID_         as mId,
                   M.NAME_       as mName,
            from TestMyBatis.dbo.Movie as M
            where M.ID_ = #{id,jdbcType=INTEGER,mode=IN};
            select G.ID_ as gId, 
                   G.NAME_ as gName
            from TestMyBatis.dbo.Genre as G
            where G.ID_ = #{id,jdbcType=INTEGER,mode=IN};
        END
</select>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接