我正在尝试在MyBatis-3.2中制定动态查询。该查询涉及一个'IN'子句,其中传递了一个项目列表。 MyBatis通过foreach构造支持'IN'子句。 该查询将非常频繁地用于可变大小的项列表。 另外,我不希望oracle每次都难以解析这个sql查询。
所以,这是我的担忧 -
1)MyBatis中的Foreach是难解析还是软解析?
2)如果软分析,何时将值替换为IN子句列表?
3)如果难以解析,是否有解决此用例的工作?在这种情况下,我们可以将列表绑定到变量以支持软解析吗?
我在网上搜索了所有这些问题,但找不到任何运气。 对此的任何评论都会有很大的帮助。 :)
先谢谢,
答案 0 :(得分:1)
据我所知,在将SQL发送到数据库进行处理之前,MyBatis将替换您的foreach。它首先替换您提供的所有参数并处理所有foreach,if等标记,然后将完整的SQL发送到数据库
答案 1 :(得分:0)
首先,在投入大量精力之前,确保解析确实是一个瓶颈。网络往返和磁盘访问通常会增加查询执行时间。
因此,您需要做的第一件事就是通过测量来衡量和指导您的工作,以避免过早优化。
将mybatis中的foreach
视为构造查询字符串的方法(您可以在更详细的java中执行此操作),然后将其提交到数据库以供执行。
软/硬解析仅在数据库中的查询处理期间才有意义,因此mybatis与此无关。
有一些方法可以克服有关IN子句的SQL限制。首先,遵循一些简化解析和/或重用解析语句的一般指导原则:
您也可以尝试创建takes array和returns result set的存储过程。 这肯定会允许您重用已解析的查询,但会增加一些复杂性,并且可能会增加查询处理的开销,如果有意义则需要进行测量。