其实数据库本身是支持物理级别的分页查询的,如mysql通过limit语句,Oracle的分页方法是嵌套子查询,需要用到rownum这个属性。
基于这一点,通过mybatis的动态sql是完全可以支持物理级别的分页查询。但这种分页查询对应的sql语句对使用不同的数据库时是不同的,这就造成更换数据库时部分语句要做调整。
为了实现上面的不足,mybatis本身提供了分页查询功能,但这个功能比较渣,他是将数据按照不分页全部查询出来,然后在内存中,根据当前页对数据进行二次过滤。这种方式在数据量较大时性能可想而知!
尽管mybatis本身的分页查询比较挫,但其框架本身的设计比较灵活,提供了插件机制,可以很方便对StatementHandler等进行拦截和扩展。现在mybatis的分页插件本身就是利用mybatis的插件机制,在mybatis执行sql语句前,将sql按照不同的数据库,进行不同的改写加上分页查询的条件,实现了物理级别的分页查询。