当MyBatis API中的Class RowBounds从DB获取数据时,它是否进行全扫描,然后剪切由limit和offset参数设置的行?或者只是绑定数据?
答案 0 :(得分:1)
如果SQL查询包含offset
和limit
/ fetch first n rows only
,则结果集将仅返回边界内的数据。边界应用于DB端。 OFFSET 10000 LIMIT 20
将生成(最多)20个记录结果集。
这可能就是你所需要的。
Rowbound不会更改SQL查询并独立运行。 Mybatis使用DB返回的整个Resultset。
例如:RowBounds(10000, 20)
将跳过结果集的前10000条记录,然后获取20条记录并停止。但结果大小可能是MAX_INT。
答案 1 :(得分:0)
它确实从数据库中检索完整数据,但只返回所请求的记录数量到程序中。因此,不必担心OutOfMemory,但查询将在数据库方面花费很长时间。
另一方面,Hibernate和Eclipselink将给定的限制计数传递到数据库,并从数据库中仅检索所需数量的记录。 Hibernate通过在其生成的SQL中使用特定于数据库供应商的SQL构造来实现此目的。 Ex-LIMIT子句在MS-SQL中,Rownum for Oracle。
如果你想在mybatis中实现同样的目标,你需要自己使用这些结构。 这很简单,您可以使用mybatis条件使SQL特定于任何数据库。