我想知道是否有可能一次执行多个SQL语句。 例如,我想从多个表中删除行,有办法可以这样做吗?
<delete id="delete" parameterType="String">
DELETE FROM DUMMYTABLE_A where X=${value}
DELETE FROM DUMMYTABLE_B where X=${value}
</delete>
我正在使用myBatis和Oracle。我猜其他数据库中也有类似的东西。实际上,您总是可以在数据库中创建过程,这通常对于未来支持项目更好。
<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之后(即下一个版本及更高版本),这将是强制性的。使用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。以下代码适用于在 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>