public static Boolean getCOUNT() { return COUNT.get(); }
/** * Mybatis拦截器方法 * * @param invocation 拦截器入参 * @return 返回执行结果 * @throws Throwable 抛出异常 */ private Object _processPage(Invocation invocation) throws Throwable { final Object[] args = invocation.getArgs(); RowBounds rowBounds = (RowBounds) args[2]; if (SqlUtil.getLocalPage() == null && rowBounds == RowBounds.DEFAULT) { if (OrderByHelper.getOrderBy() != null) { OrderByHelper.processIntercept(invocation); } return invocation.proceed(); } else { // 获取原始的ms MappedStatement ms = (MappedStatement) args[0]; // 判断并处理为PageSqlSource if (!isPageSqlSource(ms)) { processMappedStatement(ms, parser); } // 忽略RowBounds-否则会进行Mybatis自带的内存分页 args[2] = RowBounds.DEFAULT; // 分页信息 Page page = getPage(rowBounds); // pageSizeZero的判断 if ((page.getPageSizeZero() != null && page.getPageSizeZero()) && page.getPageSize() == 0) { COUNT.set(null); // 执行正常(不分页)查询 Object result = invocation.proceed(); // 得到处理结果 page.addAll((List) result); // 相当于查询第一页 page.setPageNum(1); // 这种情况相当于pageSize=total page.setPageSize(page.size()); // 仍然要设置total page.setTotal(page.size()); // 返回结果仍然为Page类型 - 便于后面对接收类型的统一处理 return page; } // 简单的通过total的值来判断是否进行count查询 if (page.isCount()) { COUNT.set(Boolean.TRUE); // 替换MS args[0] = msCountMap.get(ms.getId()); // 查询总数 Object result = invocation.proceed(); // 还原ms args[0] = ms; // 设置总数 page.setTotal((Integer) ((List) result).get(0)); if (page.getTotal() == 0) { return page; } } // pageSize>0的时候执行分页查询,pageSize<=0的时候不执行相当于可能只返回了一个count if (page.getPageSize() > 0 && ((rowBounds == RowBounds.DEFAULT && page.getPageNum() > 0) || rowBounds != RowBounds.DEFAULT)) { // 将参数中的MappedStatement替换为新的qs COUNT.set(null); BoundSql boundSql = ms.getBoundSql(args[1]); args[1] = parser.setPageParameter(ms, args[1], boundSql, page); COUNT.set(Boolean.FALSE); // 执行分页查询 Object result = invocation.proceed(); // 得到处理结果 page.addAll((List) result); } // 返回结果 return page; } }
/** * 获取Page参数 * * @return */ public static Page getLocalPage() { return LOCAL_PAGE.get(); }
/** 移除本地变量 */ public static void clearLocalPage() { LOCAL_PAGE.remove(); COUNT.remove(); }
public static void setLocalPage(Page page) { LOCAL_PAGE.set(page); }