如果你也在用 MyBatis,建议尝试该分页插件,这一定是最方便使用的分页插件。
分页插件的必要性
互联网应用中,分页可谓无处不在,在每个需要展示数据的地方,都能找到分页的影子。在日常开发中,为了追求效率,通常使用数据库的物理分页。这时,对于一个业务逻辑SQL,大多数情况需要输出两段SQL来达到分页效果:count查询总数和limit分页,这无疑增加了大量的工作量。对于这种大量的、相似的、非业务逻辑的代码,抽象出公共插件是势在必行的。
分页插件原理
Mybatis给开发者提供了一个拦截器接口,只要实现了该接口,就可以在Mybatis执行SQL前,作一些自定义的操作。分页插件就是在此基础上开发出来的,对于一个需要分页的SQL,插件会拦截并生成两段SQL。举一个简单的例子:
原SQL:
拦截后的查询总数SQL:
拦截后的分页SQL:
这样我们只需要根据业务逻辑开发原SQL,不需关心分页语法对原SQL的影响,拦截器已经为我们处理好了。更多拦截器的信息可以参考:
支持的数据库
该插件目前支持以下数据库的物理分页:
- Oracle
- Mysql
- MariaDB
- SQLite
- Hsqldb
- PostgreSQL
- DB2
- SqlServer(2005,2008)
- Informix
- H2
- SqlServer2012
- Derby
- Phoenix
与SpringMVC集成
Maven依赖
|
|
Spring配置文件
只需要在原来配置Mybatis的SqlSessionFactoryBean
的地方加上分页插件的配置即可,具体区别请看以下的对比:
原来的配置方式:
加上分页插件的配置方式:
可以看到仅仅是加了<property name="plugins">
的配置。在<property name="properties">
里可以配置分页参数,一般情况下配置数据库类型helperDialect
即可。完整的参数如下:
在代码中使用
在需要进行分页的Mybatis方法前调用PageHelper.startPage静态方法即可,紧跟在这个方法后的第一个Mybatis查询方法会被进行分页,然后分页插件会把分页信息封装到PageInfo
中。
以这种对原SQL无侵害的方法,就可以得到分页的效果和详细的分页信息。PageInfo包含了非常全面的分页属性:
具体的例子
原SQL:
拦截后的SQL(源自Mybatis日志信息):
|
|
返回的json数据:
返回数据用一个自定义类Result
来封装,models
是业务数据,paging
是分页信息。
总结
使用分页插件时,不需要在分页的地方手写分页SQL和count的SQL,不需要更改已有的业务代码,只需要在执行SQL前调用一句代码即可实现分页,并得到丰富的分页信息。有了这些分页信息,前端可以选用多种分页方法,非常方便!