一尘不染

MyBatis RowBounds不限制查询结果

sql

我正在开发需要支持分页的无状态API。

我使用一个Oracle数据库。我使用Spring和MyBatis进行数据库访问。

从文档中可以理解,我可以使用RowBounds类限制查询返回的行数。

但是,似乎没有对查询进行特殊优化以支持分页。

例如,如果我将RowBounds设置为具有50条记录的偏移量100,那么我希望查询中添加以下内容:

(original query with the where clause...)
and ROWNUM < 150
and ROWNUM >= 100

但是那里什么也没有,只是我手动定义的查询。

这对性能来说很糟糕,因为我可能会有数千个结果。

我究竟做错了什么?

谢谢。


阅读 135

收藏
2021-03-17

共1个答案

一尘不染

Mybatis遗留了许多SQL driver要使用的东西,似乎周围的确切行为RowBounds就是其中之一。

请参阅http://mybatis.github.io/mybatis-3/java-
api.html,尤其是显示以下内容的部分:

在这方面,不同的驱动程序能够实现不同级别的效率。为了获得最佳性能,请使用SCROLL_SENSITIVE或SCROLL_INSENSITIVE的结果集类型(换句话说:不是FORWARD_ONLY)。

默认值显然是UNSET,但是您可以尝试在标记中SCROLL_SENSITIVE用作ResultSetType属性select,看看是否有帮助。有关更多信息,请参见http://mybatis.github.io/mybatis-3/sqlmap-
xml.html。

如果不工作,你总是可以通过开沟使用的解决问题RowBounds和实现 SettingsBean
类(或类似),您的select标签将采取的parameterType,并包含字段的offsetlimit(或也许rowStartrowEnd作出更有意义Oracle,然后您可以根据需要在运行时进行设置,并在执行时将其动态插值到SQL中select

再加上一些代码,您就可以通过纯动态SQL完全根据需要控制行为。我在和上使用了类似的方法,Mybatis并且Postgres效果很好。

因此,您将使用这些字段以及它们的getter和setter来实现 SettingsBean 类,然后您的select语句可能类似于:

<select
  id="selectFoo"
  parameterType="com.foo.bar.SettingsBean">

select *
from foo
where rownum >= #{rowStart}
  and rownum < #{rowEnd}
</select>
2021-03-17