web-dev-qa-db-ja.com

MyBatisが一度に複数のSQLステートメントを実行することは可能ですか?

一度に複数のSQLステートメントを実行できるかどうか疑問に思っていました。たとえば、複数のテーブルから行を削除するシナリオでは、次のようなことができます。

<delete id="delete" parameterType="String">
    DELETE FROM DUMMYTABLE_A where X=${value}
    DELETE FROM DUMMYTABLE_B where X=${value}
</delete>
17
Marco

はい、ほとんどのデータベースでこれが可能です。通常、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ステートメント間のセミコロンだけです。

16

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>
23
StrekoZ

誰かがのようなエラーを得た場合

原因:Java.sql.SQLSyntaxErrorException:SQL構文にエラーがあります。 MariaDBサーバーのバージョンに対応するマニュアルで、 'UPDATE mytableの近くで使用する正しい構文を確認してください

ドライバーでマルチクエリを許可することでこれを修正できます。 mariadbの場合は、MySQLと同じです。

allowMultiQuery = true

次のmybatisの問題に記載 https://github.com/mybatis/mybatis-3/issues/1497

1
Sunil Poudel