一度に複数のSQLステートメントを実行できるかどうか疑問に思っていました。たとえば、複数のテーブルから行を削除するシナリオでは、次のようなことができます。
<delete id="delete" parameterType="String">
DELETE FROM DUMMYTABLE_A where X=${value}
DELETE FROM DUMMYTABLE_B where X=${value}
</delete>
はい、ほとんどのデータベースでこれが可能です。通常、SQLステートメントを何かで区切る必要があります。 PostGRESおよびMySQLでは、セミコロン(;)です。 Microsoft SQLサーバーでは、キーワード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によるトランザクションもサポートします。トランザクションを使用すると、実際にすべてのステートメントを1つのアトミック操作にバッチ処理できます。その一部が失敗した場合、3つすべてがロールバックされます。それらの詳細については、 http://www.sqlteam.com/article/introduction-to-transactions を参照してください。
おそらく、必要なのはSQLステートメント間のセミコロンだけです。
OracleでmyBatisを使用しています。他のDBにも似たようなものがあると思います。実際、プロジェクトをサポートする必要がある場合は、常にDBでプロシージャを作成できます。
<delete id="deleteUnfinishedData" parameterType="map">
{call
declare
begin
delete from TABLE1 where id = #{valueFromMap1};
delete from TABLE2 where id = #{valueFromMap2};
end
}
</delete>
誰かがのようなエラーを得た場合
原因:Java.sql.SQLSyntaxErrorException:SQL構文にエラーがあります。 MariaDBサーバーのバージョンに対応するマニュアルで、 'UPDATE mytableの近くで使用する正しい構文を確認してください
ドライバーでマルチクエリを許可することでこれを修正できます。 mariadbの場合は、MySQLと同じです。
allowMultiQuery = true
次のmybatisの問題に記載 https://github.com/mybatis/mybatis-3/issues/1497