我正在开发需要支持分页的无状态API。
我使用一个Oracle数据库。我使用Spring和MyBatis进行数据库访问。
从文档中可以理解,我可以使用RowBounds类限制查询返回的行数。
但是,似乎没有对查询进行特殊优化以支持分页。
例如,如果我将RowBounds设置为具有50条记录的偏移量100,那么我希望查询中添加以下内容:
(original query with the where clause...) and ROWNUM < 150 and ROWNUM >= 100
但是那里什么也没有,只是我手动定义的查询。
这对性能来说很糟糕,因为我可能会有数千个结果。
我究竟做错了什么?
谢谢。
Mybatis遗留了许多SQL driver要使用的东西,似乎周围的确切行为RowBounds就是其中之一。
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。
UNSET
SCROLL_SENSITIVE
ResultSetType
select
如果不工作,你总是可以通过开沟使用的解决问题RowBounds和实现 SettingsBean 类(或类似),您的select标签将采取的parameterType,并包含字段的offset和limit(或也许rowStart并rowEnd作出更有意义Oracle,然后您可以根据需要在运行时进行设置,并在执行时将其动态插值到SQL中select。
parameterType
offset
limit
rowStart
rowEnd
Oracle
再加上一些代码,您就可以通过纯动态SQL完全根据需要控制行为。我在和上使用了类似的方法,Mybatis并且Postgres效果很好。
Postgres
因此,您将使用这些字段以及它们的getter和setter来实现 SettingsBean 类,然后您的select语句可能类似于:
<select id="selectFoo" parameterType="com.foo.bar.SettingsBean"> select * from foo where rownum >= #{rowStart} and rownum < #{rowEnd} </select>