2014-02-17 38 views
2

我想在MyBatis-3.2中制定一个动态查询。查询涉及传递项目列表的“IN”子句。 MyBatis通过foreach构造支持'IN'子句。 该查询将非常频繁地使用可变大小的项目列表。 另外,我不希望oracle每次都难以解析这个sql查询。Mybatis中的Foreach是硬解析还是软解析?

因此,这里有我的顾虑 -

1)的foreach在MyBatis的是硬的解析或软解析?

2)如果它是软解析,什么时候将值替换为IN子句的列表?

3)如果它很难解析,是否有解决方案来支持这个用例?在这种情况下,我们可以将列表绑定到一个变量来支持软解析吗?

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

由于事先

回答

1

据我所知,MyBatis中SQL被发送到数据库处理之前,将取代你的foreach。它首先用你提供的所有参数进行替换,然后处理所有的foreach,等等。然后将完整的SQL发送到数据库

0

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

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

想象一下在mybatis中用foreach作为一种构造查询字符串的方式(你可以在java中做更多的冗长)然后提交给数据库执行。 只有在数据库的查询处理过程中,软/硬解析才有意义,所以mybatis与此无关。

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

  1. 如果可能,根本不要使用IN。考虑IN的参数来自哪里。他们是否因某些查询而出现?你可以合并两个查询并且不将列表传递给IN?
  2. 使用简单查询。如果查询很简单,解析的“难”阶段也将花费更少的时间。

您也可以尝试创建存储过程,其中takes arrayreturns result set。 这肯定会允许您重新使用已分析的查询,但是如果有意义的话,会增加查询处理的复杂性和潜在开销,这些查询处理需要进行测量。