浅谈mybatis分页查询

概述

抛开mybatis的分页实现方式,这里先简单叙述一下在应用程序中进行分页的实现方式。基本就是两种:

内存分页。内存分页就是根据sql语句将所有的数据从数据库中查询出来,装载到内存,然后在内存中根据分页参数(参数1:从第几条开始查询;参数2:查询几条)选取符合条件的记录。

物理分页。物理分页是在sql语句中就附带了分页参数,所以查询出的结果就是期望的分页结果,无需再在内存中做分页的逻辑。

这两种思路各有优缺点:

内存分页实现简单,能兼容所有的数据库。因为不同数据库的分页查询条件是不同的(比如,mysql:limit offset limit;oracle:rownum),使用内存分页不用在sql语句后面附加分页查询条件,从而sql语句更加兼容。但是确定同样明显,对数据库和网络IO都会带来很大的压力。在业务量稍大的系统中,该方案都不可取。

物理分页的优缺点和内存分页的相反,性能好,但是使用较繁琐,需要针对不同的数据库书写不同的sql语句。
mybatis的分页方式

在mybatis的官方文档中对分页做了介绍(这里),其思路就是在数据查询接口中传递RowBounds参数,接口如下:

使用方式如下:

调用方式:

list中的是符合sql语句的第11-15(均包含)条数据。

我们可以看到,在sql语句中没有附加分页查询的条件,却得到了分页查询的效果。那么mybatis中是怎么实现的呢?其实就是上面所说的内存分页方式,其关键的代码如下:

mybatis内存分页的逻辑:

我们已经明白内存分页的方式是不可取的,那么在使用mybatis的时候怎么进行分页呢?既然内存分页不能使用,那就只能进行物理分页了,其实就是在查询语句中附加分页查询的条件。这样就会导致针对每一种数据库需要维护一套分页查询的sql语句,略微繁琐。

那能不能融合融合内存分页和物理分页的有点呢?即sql语句只用维护一套,而实现物理分页呢?答案是有的,可以参考Mybatis-PageHelper,目前我还没有对其进行深入研究。其大致的思路就是利用mybatis提供的plugin功能拦截数据库查询,根据不同的数据库在查询语句的后面附件不用的分页查询条件。

至于有没有必要在项目中使用Mybatis-PageHelper,我觉得如果分页需求较少,自己手写分页sql便可,毕竟引入第三方的插件会存在引入额外bug的可能。

更多mybatis使用心得,请持续关注本站:http://791202.com/

0

发表评论

邮箱地址不会被公开。