title: 使用分页插件的后悔药(二) tags:

  • PageHelper
  • Mybatis 通用 Mapper
  • orderByOnly
  • 分页
  • mybatis categories: mybatis date: 2018-01-03 16:46:13

背景

我们使用了pageHelper之后大部分的需求可以满足了 部分场景下不需要使用count等语句来做分页,只需要做sql查询

上一篇我们对于分页插件的问题进行了一些描述以及解决1

使用分页插件的后悔药

问题

小伙伴在使用了一段时间之后提出了新的需求。现在使用了分页插件之后已经不写orderby语句了

但是在某些场景下现在不需要使用分页 但是仍然需要使用orderby

我们在使用分页插件的后悔药中 提到使用enableCount的参数来解决

但是这样分页插件的逻辑将不会执行了 也就不会执行orderby

有没有办法也使用到orderby呢???

解决

抛出一个问题 当然是要解决的 我们来看一下具体执行分页的逻辑是啥

    @Overridepublic boolean skip(MappedStatement ms, Object parameterObject, RowBounds rowBounds) {Page page = sqlUtil.getPage(parameterObject, rowBounds);if (page == null) {return true;}return (page.getPageSizeZero() != null && page.getPageSizeZero()) && page.getPageSize() == 0;}
复制代码

上篇已经分析过可以设置pageSize 那我们需要分页插件的逻辑只是不希望执行count有没有办法呢?

    @Overridepublic boolean beforeCount(MappedStatement ms, Object parameterObject, RowBounds rowBounds) {Page page = SqlUtil.getLocalPage();return !page.isOrderByOnly() && page.isCount();}
复制代码

很明显还有一个参数名为orderByOnly

顾名思义应该是制作排序【那自然不需要count了】

我们再看一下在做查询的时候是否也不会吧页数设置进去

    @Overridepublic String getPageSql(MappedStatement ms, BoundSql boundSql, Object parameterObject, RowBounds rowBounds, CacheKey pageKey) {String sql = boundSql.getSql();Page page = SqlUtil.getLocalPage();//支持 order byString orderBy = page.getOrderBy();if (StringUtil.isNotEmpty(orderBy)) {pageKey.update(orderBy);sql = OrderByParser.converToOrderBySql(sql, orderBy);}if (page.isOrderByOnly()) {return sql;}return getPageSql(sql, page, rowBounds, pageKey);}
复制代码

很明显当isOrderByOnly设置时此时分页也不会执行。

因此我们改造SoInterceptor如下

    @Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}))public class SoInterceptor implements Interceptor {private static final Joiner SORT_JOINER = Joiner.on(Constants.COMMA);@Overridepublic Object intercept(Invocation invocation) throws Throwable {Object paramter = invocation.getArgs()[1];if (paramter instanceof So) {So so = (So) paramter;Page<Object> page = PageHelper.startPage(so.getCurrentPage(), so.getPageSize(), so.isEnableCount());page.setOrderByOnly(so.isOrderByOnly());if (so.getSorts() != null && !so.getSorts().isEmpty()) {page.setOrderBy(SORT_JOINER.join(so.getSorts()));}try {return invocation.proceed();} finally {PageHelper.clearPage();}}return invocation.proceed();}@Overridepublic Object plugin(Object target) {if (target instanceof Executor) {return Plugin.wrap(target, this);} else {return target;}}@Overridepublic void setProperties(Properties properties) {// Do nothing}}
复制代码

这样就可以既不分页也带排序了【条件带上orderByOnly=true】

使用分页插件的后悔药(二)相关推荐

  1. Spring boot 实战指南(二):Mybatis、动态绑定、多数据源、分页插件、Mybatis-Plus

    文章目录 一.整合Mybatis 1.搭建数据库环境 2.基于注解整合Mybatis (1)创建项目 (2)具体代码实现 (3)测试 3.基于xml整合Mybatis 4.Mybatis的动态SQL ...

  2. SpringBoot整合MP(MybatisPlus)分页插件pagehelper和pagination区别

    MP分页插件的安装步骤: 1. 添加MybatisPlusConfig 类 /*** @author miemie* @since 2018-08-10*/ @Configuration public ...

  3. angular分页插件tm.pagination 解决触发二次请求的问题

    angular分页插件tm.pagination(解决触发二次请求的问题) DEMO:  http://jqvue.com/demo/tm.pagination/index.html#?current ...

  4. Springboot 系列(十二)使用 Mybatis 集成 pagehelper 分页插件和 mapper 插件

    前言 在 Springboot 系列文章第十一篇里(使用 Mybatis(自动生成插件) 访问数据库),实验了 Springboot 结合 Mybatis 以及 Mybatis-generator 生 ...

  5. Jquery前端分页插件pagination同步加载和异步加载

    上一篇文章介绍了Jquery前端分页插件pagination的基本使用方法和使用案例,大致原理就是一次性加载所有的数据再分页.https://www.jianshu.com/p/a1b8b1db025 ...

  6. Mybatis插件原理和PageHelper结合实战分页插件(七)

    今天和大家分享下mybatis的一个分页插件PageHelper,在讲解PageHelper之前我们需要先了解下mybatis的插件原理.PageHelper 的官方网站:https://github ...

  7. 分页插件php,文章内容分页插件

    应用信息 名称: 文章内容分页插件 售价: 128元 应用ID: NextPage 最低要求: Z-BlogPHP 1.5.2.1935 (Zero) Build 151935 版 本: 6.1 发布 ...

  8. springboot-mysql-pagehelper分页插件集成

    pagehelper分页插件 springboot-mysql-pagehelper集成 pagehelperjar: <dependency><groupId>com.git ...

  9. (血和泪的成果)使用PageHelper分页插件进行后台分页

    前些天按照视频里讲的做一个分页功能,可是不知道什么原因在页面就是不显示数据.昨天碰巧发现了一个分页插件,只需一些设置就可以完成分页,非常方便.不过由于是新手,其中遇到了很多很多麻烦,不过幸好得到大神的 ...

最新文章

  1. Struts2 分割字符串标签s:generator
  2. SQL学习笔记:库和表的创建
  3. python3-python3--内置函数
  4. 计算机网络:大小端存储
  5. 用vector实现一个变长数组
  6. Microsoft Exchange 2010 安装配置
  7. 腾讯云数据库 MySQL 8.0 正式上线,性能全面超越官方版本
  8. 采用我国国产处理器的超级计算机是,“中国芯”超级电脑合肥诞生 首次采用国产CPU芯片...
  9. presto是如何保证作业内存不会发生冲突和溢出
  10. 苹果官方将首次参与天猫 618 促销活动;淘宝回应用户账号被禁用980年;Julia 1.5.0 beta1 发布 | 极客头条...
  11. 开发板添加上 Web 界面+openwrt luci界面修改
  12. Android播放在线音乐文件
  13. 【ThinkPHP】后台数组,赋值到前台模板HTML文件中的JS的变量,且以JSON对象形式存放
  14. Java中将将JPG图片转GIF动画和将GIF转JPG图片
  15. Allegro 走高速线等长线时怎么画成椭圆的走线
  16. 分布式系统中可用性及容错性的区别
  17. kmeans python interation flag_Bisecting k-means聚类算法实现
  18. VM的三种网络连接方式
  19. 无任何格外需求的命令行C++飞机大战,内含BOSS,动画,千行代码免费奉上
  20. SuperMap iObjects C++在Linux上面的使用

热门文章

  1. Python自动化运维之5、内置函数
  2. No Database Selected
  3. python基础课程_学习笔记13:标准库:有些收藏夹——sys
  4. Java从零开始学六(运算符)
  5. 转:java中数组与List相互转换的方法
  6. CEGUI Lua 编码
  7. android—label窗口——基础编
  8. java 泛型 窜讲
  9. gradle常用命令
  10. Linux常用安全设置