老声常谈,分页查询的实现就是不分页
分页查询是经常遇到的问题,几乎每个项目都会遇到,如此常见的问题,我们的数据库却没有提供现成的解决方法,例如Oracle提供Rownum字段,SQLServer提供TOP关键字,MySQL提供Limit关键字。Hibernate作为常用的ORM方案,也没提供一个类似pageQuery之类的方法。他们都提供了分页查询的途径却没有提供分页查询的直接实现。为什么呢。
其实无论是TOP还是setMaxResults,都不是用于分页查询的,他们的目的在于通过限制抓取数量来提高查询性能,Rownum也是如此,这就是为什么Rownum在OrderBy之后就乱的原因(Oracle完全有能力让它OrderBy之后仍然有序)。那么我们怎么还要分页查询呢?无非是两个原因,其一是提高性能,其二是方便用户使用――没有哪个用户会关心1000行之外的数据。
这样就简单了,我们不必费心如何高效而优雅的从数据库中抓取某一页数据,而是在查询出所有数据(在maxResults限制下)之后,在内存中分页。例如,List getUsers()获取前1000个用户――对于企业应用,这已经很多了――在返回的List中作分页,即高效又简单,而且如果加入缓存机制之后,就不必每次翻页都重新查询了。
下面是示意类图:
cats_tigeresV5bl0fFs.JPG