Java Mybatis中的Foreach是硬解析还是软解析?

Java Mybatis中的Foreach是硬解析还是软解析?,java,database,oracle,mybatis,dynamic-sql,Java,Database,Oracle,Mybatis,Dynamic Sql,我试图在MyBatis-3.2中构造一个动态查询。查询涉及一个“IN”子句,其中传递一个项目列表。MyBatis通过foreach构造支持“IN”子句。 查询将经常用于可变大小的项目列表。 另外,我不希望oracle每次都硬解析这个sql查询 因此,以下是我的担忧- 1) MyBatis中的Foreach是硬解析还是软解析 2) 如果是软解析的,那么何时将值替换到IN子句的列表中 3) 如果它很难解析,是否有一个解决方案来支持这个用例?在这种情况下,我们可以将列表绑定到一个变量以支持软解析吗 我

我试图在MyBatis-3.2中构造一个动态查询。查询涉及一个“IN”子句,其中传递一个项目列表。MyBatis通过foreach构造支持“IN”子句。 查询将经常用于可变大小的项目列表。 另外,我不希望oracle每次都硬解析这个sql查询

因此,以下是我的担忧-

1) MyBatis中的Foreach是硬解析还是软解析

2) 如果是软解析的,那么何时将值替换到IN子句的列表中

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

我在网上搜索了所有这些问题,但没有找到任何运气。 对此发表任何评论都会大有裨益。:)


提前感谢,

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

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

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

考虑一下mybatis中的
foreach
,它是一种构造查询字符串的方法(您也可以在java中更详细地构造查询字符串),然后将查询字符串提交给数据库执行。 软/硬解析只有在数据库中的查询处理期间才有意义,所以mybatis与此无关

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

  • 如果可能的话,不要在任何地方使用。思考要输入的参数从何而来。他们是因为一些疑问而来的吗?您能否合并两个查询,而不将列表传递给IN
  • 使用简单的查询。如果查询很简单,那么解析的“硬”阶段也会花费更少的时间
  • 您还可以尝试创建存储过程,该存储过程和。 这肯定会允许您重用已解析的查询,但是会给查询处理增加一些复杂性和潜在的开销,如果有意义的话,需要进行度量