Mybatis中的Foreach是难解析还是软解析?

时间:2014-02-17 13:25:52

标签: java database oracle mybatis dynamic-sql

我正在尝试在MyBatis-3.2中制定动态查询。该查询涉及一个'IN'子句,其中传递了一个项目列表。 MyBatis通过foreach构造支持'IN'子句。 该查询将非常频繁地用于可变大小的项列表。 另外,我不希望oracle每次都难以解析这个sql查询。

所以,这是我的担忧 -

1)MyBatis中的Foreach是难解析还是软解析?

2)如果软分析,何时将值替换为IN子句列表?

3)如果难以解析,是否有解决此用例的工作?在这种情况下,我们可以将列表绑定到变量以支持软解析吗?

我在网上搜索了所有这些问题,但找不到任何运气。 对此的任何评论都会有很大的帮助。 :)

先谢谢,

2 个答案:

答案 0 :(得分:1)

据我所知,在将SQL发送到数据库进行处理之前,MyBatis将替换您的foreach。它首先替换您提供的所有参数并处理所有foreach,if等标记,然后将完整的SQL发送到数据库

答案 1 :(得分:0)

首先,在投入大量精力之前,确保解析确实是一个瓶颈。网络往返和磁盘访问通常会增加查询执行时间。

因此,您需要做的第一件事就是通过测量来衡量和指导您的工作,以避免过早优化。

将mybatis中的foreach视为构造查询字符串的方法(您可以在更详细的java中执行此操作),然后将其提交到数据库以供执行。 软/硬解析仅在数据库中的查询处理期间才有意义,因此mybatis与此无关。

有一些方法可以克服有关IN子句的SQL限制。首先,遵循一些简化解析和/或重用解析语句的一般指导原则:

  1. 如果可能,请不要使用IN。想想IN的参数来自哪里。它们是来自某些查询的结果吗?你能合并两个查询而不将列表传递给IN吗?
  2. 使用简单查询。如果查询很简单,解析的“硬”阶段也会花费更少的时间。
  3. 您也可以尝试创建takes arrayreturns result set的存储过程。 这肯定会允许您重用已解析的查询,但会增加一些复杂性,并且可能会增加查询处理的开销,如果有意义则需要进行测量。