看完趣味数学书后,开始技术填坑之路
通常在业务中,需要进行数据分页查询,这样一来,每条SQL语句都加上limit限制,会多了很多重复的代码,而且每次需要自己在代码中进行偏移量的计算,略微有些麻烦。
还好有大神在Github里贡献了分页插件,而且使用起来很方便,了解了一下使用原理,发现是使用了MyBatis里面的拦截器Interceptor,学习记录一下。
简单🌰
项目中进行引用
一般JavaWeb项目使用到的是maven和gradle进行项目管理
1 | <dependency> |
在mybatis-config或者spring中进行配置
1 | mybatis: |
我是用的是第二种配置方式(Spring),更加细详细配置说明可以在Github文档中进行查看。
mapper查询语句
为了简单,使用了单表查询
1 | <select id="selectByUserId" resultMap="BaseResultMap"> |
代码使用
查询时,在代码中使用的是官网推荐的第二种实现方式,
1 | // 使用这个方法,接下来的第一个select方法会进行分页 |
分页插件,源码实现原理
该插件支持很多数据库,Oracle、MySQL、mongdb等都支持,一般常用的话是MySQL,测试用的项目也是使用MySQL作为持久层,该分页插件可以通过autoDialect自动方言适配了MySQL。
插件通过MyBatis的拦截器Interceptor进行SQL重写,可以从源码中看出
统计数量
拦截器入口:com.github.pagehelper.PageInterceptor#intercept
获取统计数量的方法:com.github.pagehelper.parser.CountSqlParser#getSmartCountSql(java.lang.String, java.lang.String)
1 | /** |
通过该方法,去掉参数args,然后改成count(*),修改成统计数量的SQL。
进行分页查询
具体调用方法:com.github.pagehelper.dialect.helper.MySqlDialect#getPageSql
1 |
|
从这里看出,该插件不是通过内存进行分页,而是通过修改SQL进行物理分页。
总结
感觉这个分页插件没有入侵代码,实现思想也很优雅,体现了拦截器思想,最后结果就不贴出来了,一般查询出来total总量和分页数据就足够了。