MyBatis, выполняющий несколько SQL-запросов за один раз, возможно?

Мне было интересно, можно ли выполнить несколько операторов sql за 1 проход. Например, сценарий, который я хочу удалить из нескольких таблиц, есть способ, которым я могу делать такие вещи, как..

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

Ответы

Ответ 1

Да, большинство баз данных позволяют это. Обычно вам нужно каким-то образом ограничивать ваши SQL-операторы. В PostGRES и MySQL это точка с запятой (;). На сервере Microsoft SQL вы должны использовать ключевое слово GO. [Обновление за май 2013 г.: Начиная с 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!

Ответ 2

Я использую myBatis с Oracle. Я думаю, что есть что-то подобное в другой БД. На самом деле вы всегда можете создавать процедуры в БД, что обычно лучше для будущего, когда вам нужно поддерживать проект.

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