MyBatis 一次执行多条sql语句,这可能吗?

新手上路,请多包涵

我想知道是否可以一次执行多个 sql 语句。例如我想从多个表中删除行的场景,有没有办法我可以做类似的事情……

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

原文由 Marco 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

是的,大多数数据库都允许这样做。通常你必须用一些东西来分隔你的 SQL 语句。在 PostGRES 和 MySQL 中,它是一个分号 (;)。在 Microsoft SQL Server 中,您应该使用关键字 GO。 [ 2013 年 5 月更新:从 SQL Server 2012 开始,您可以而且应该使用分号来分隔语句。在 SQL Server 2012(即下一个版本及更高版本)之后,这些将是强制性的。在 SQL2012 及更高版本中,使用 GO 现在已被弃用)。 ]

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 语句之间的分号!

原文由 Professor Falken 发布,翻译遵循 CC BY-SA 3.0 许可协议

我在 Oracle 中使用 myBatis。我想其他数据库中也有类似的东西。实际上,您总是可以在 DB 中创建过程,这通常对将来更好,当您必须支持该项目时。

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

原文由 StrekoZ 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题