使用 github 上 分页 插件
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
</dependency>
在mybatis-config.xml 中添加 plugin
<plugin interceptor="com.curiousby.util.PagePluginWrapper">
<property name="dialect" value="mysql"/>
<property name="pageSqlId" value=".*listPage.*"/>
</plugin>
配置datasources
<!-- 配置mybitasSqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<property name="typeAliasesPackage" value="com.curiousby.entity"></property>
<property name="mapperLocations" value="classpath:mapping/*.xml"></property>
</bean>
package com.curiousby.util;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Properties;
import javax.xml.bind.PropertyException;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.util.StringUtils;
import com.github.pagehelper.PageHelper;
/**
* @see com.curiosuby.util.PagePluginWrapper
* @author baoyou E-mail:curiousby@163.com
* @version 2017年3月14日 下午5:52:11
* desc:
*/
@Intercepts(@Signature(type = Executor.class, method = "query", args = { MappedStatement.class,
Object.class, RowBounds.class, ResultHandler.class }))
public class PagePluginWrapper extends PageHelper {
// private static final Logger log = LoggerFactory.getLogger(PagePluginWrapper.class);
private String pageSqlId = "";
/**
*
*/
public Object intercept(Invocation ivk) throws Throwable {
// log.info("pageSqlId:" + pageSqlId);
if (ivk.getTarget() instanceof Executor) {
return this.invokePageIntercept(ivk);
}
return ivk.proceed();
}
private Object invokePageIntercept(Invocation ivk) throws Throwable {
// log.info("invokePageIntercept");
MappedStatement mappedStatement = (MappedStatement) ivk.getArgs()[0];
// log.info("mappedStatement id:" + mappedStatement.getId());
if (mappedStatement.getId().matches(pageSqlId)) { // 拦截需要分页的SQL
Object parameter = ivk.getArgs()[1];
BoundSql boundSql = mappedStatement.getSqlSource().getBoundSql(parameter);
Object parameterObject = boundSql.getParameterObject();// 分页SQL<select>中parameterType属性对应的实体参数,即Mapper接口中执行分页方法的参数,该参数不得为空
if (parameterObject == null) {
throw new NullPointerException("parameterObject尚未实例化!");
} else {
boolean pagable = setPage(parameterObject);
if (pagable) {
Object obj = super.intercept(ivk);
if (obj instanceof com.github.pagehelper.Page) {
com.github.pagehelper.Page page = (com.github.pagehelper.Page) obj;
this.setTotalPage(parameterObject, page);
return page.getResult();
}
}
}
}
return ivk.proceed();
}
private void setTotalPage(Object parameterObject, com.github.pagehelper.Page resultPage)
throws Throwable {
//log.info("setTotalPage");
Page page = null;
Integer totalResult = Integer.valueOf("" + resultPage.getTotal());
if (parameterObject instanceof Page) { // 参数就是Page实体
page = (Page) parameterObject;
page.setTotalResult(totalResult);
} else if (parameterObject instanceof java.util.HashMap) { // 参数是HashMap
HashMap<Object, Object> parms = (HashMap<Object, Object>) parameterObject;
parms.put("count", totalResult);
} else { // 参数为某个实体,该实体拥有Page属性
Field pageField = ReflectHelper.getFieldByFieldName(parameterObject, "page");
if (pageField != null) {
page = (Page) ReflectHelper.getValueByFieldName(parameterObject, "page");
if (page == null) {
page = new Page();
}
page.setTotalResult(totalResult);
ReflectHelper.setValueByFieldName(parameterObject, "page", page); // 通过反射,对实体对象设置分页对象
} else {
throw new NoSuchFieldException(parameterObject.getClass().getName()
+ "不存在 page 属性!");
}
}
}
/**
* 是否有分页参数,没有则不分页
* @param parameterObject
* @return
* @throws Throwable
*/
private boolean setPage(Object parameterObject) throws Throwable {
// log.info("setpage");
Page page = null;
Integer pageNo = 1;
Integer maxRow = 10;
if (parameterObject instanceof Page) { // 参数就是Page实体
page = (Page) parameterObject;
pageNo = page.getCurrentPageDef();
maxRow = page.getShowCount();
} else if (parameterObject instanceof java.util.HashMap) { // 参数是HashMap
HashMap<Object, Object> parms = (HashMap<Object, Object>) parameterObject;
if (!parms.containsKey("pageNo") || !parms.containsKey("maxRow")) {
return false;
}
pageNo = (Integer) parms.get("pageNo");
maxRow = (Integer) parms.get("maxRow");
} else { // 参数为某个实体,该实体拥有Page属性
Field pageField = ReflectHelper.getFieldByFieldName(parameterObject, "page");
if (pageField != null) {
page = (Page) ReflectHelper.getValueByFieldName(parameterObject, "page");
if (page == null) {
return false;
} else {
pageNo = page.getCurrentPageDef();
maxRow = page.getShowCount();
}
} else {
throw new NoSuchFieldException(parameterObject.getClass().getName()
+ "不存在 page 属性!");
}
}
//log.info("page:pageNo=" + pageNo + ",maxRow=" + maxRow);
super.startPage(pageNo, maxRow);
return true;
}
public void setProperties(Properties p) {
super.setProperties(p);
pageSqlId = p.getProperty("pageSqlId");
if (StringUtils.isEmpty(pageSqlId)) {
try {
throw new PropertyException("pageSqlId property is not found!");
} catch (PropertyException e) {
e.printStackTrace();
}
}
}
}
ReflectHelper
package com.curiousby.util;
import java.lang.reflect.Field;
/**
* 反射 工具
* @author baoyou E-mail:curiousby@163.com
* @version 2017年3月14日 下午4:50:14
* desc:
*/
public class ReflectHelper {
/**
* 获取obj对象fieldName的Field
* @param obj
* @param fieldName
* @return
*/
public static Field getFieldByFieldName(Object obj, String fieldName) {
for (Class<?> superClass = obj.getClass(); superClass != Object.class; superClass = superClass
.getSuperclass()) {
try {
return superClass.getDeclaredField(fieldName);
} catch (NoSuchFieldException e) {
}
}
return null;
}
/**
* 获取obj对象fieldName的属性值
* @param obj
* @param fieldName
* @return
* @throws SecurityException
* @throws NoSuchFieldException
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public static Object getValueByFieldName(Object obj, String fieldName)
throws SecurityException, NoSuchFieldException,
IllegalArgumentException, IllegalAccessException {
Field field = getFieldByFieldName(obj, fieldName);
Object value = null;
if(field!=null){
if (field.isAccessible()) {
value = field.get(obj);
} else {
field.setAccessible(true);
value = field.get(obj);
field.setAccessible(false);
}
}
return value;
}
/**
* 设置obj对象fieldName的属性值
* @param obj
* @param fieldName
* @param value
* @throws SecurityException
* @throws NoSuchFieldException
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public static void setValueByFieldName(Object obj, String fieldName,
Object value) throws SecurityException, NoSuchFieldException,
IllegalArgumentException, IllegalAccessException {
Field field = obj.getClass().getDeclaredField(fieldName);
if (field.isAccessible()) {
field.set(obj, value);
} else {
field.setAccessible(true);
field.set(obj, value);
field.setAccessible(false);
}
}
}
page
package com.curiousby.util;
import java.io.Serializable;
/**
* 反射 工具
* @author baoyou E-mail:curiousby@163.com
* @version 2017年3月14日 下午4:50:14
* desc:
*/
public class Page implements Serializable {
private int showCount = 10; // 每页显示记录数
private int totalPage; // 总页数
private int totalResult; // 总记录数
private int currentPage; // 当前页
private int currentResult; // 当前记录起始索引
private boolean entityOrField; // true:需要分页的地方,传入的参数就是Page实体;false:需要分页的地方,传入的参数所代表的实体拥有Page属性
private String pageStr; // 最终页面显示的底部翻页导航,详细见:getPageStr();
public Page() {
}
public Page(int showCount, int currentPage) {
this.showCount = showCount;
this.currentPage = currentPage;
}
public int getTotalPage() {
if (totalResult % showCount == 0) {
totalPage = totalResult / showCount;
} else {
totalPage = totalResult / showCount + 1;
}
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getTotalResult() {
return totalResult;
}
public void setTotalResult(int totalResult) {
this.totalResult = totalResult;
}
public int getCurrentPage() {
if (currentPage <= 0) {
currentPage = 1;
}
if (currentPage > getTotalPage()) {
currentPage = getTotalPage();
}
return currentPage;
}
public int getCurrentPageDef() {
return currentPage == 0 ? 1 : currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public String getPageStr() {
StringBuffer sb = new StringBuffer();
if (totalResult > 0) {
sb.append(" <ul>\n");
if (currentPage == 1) {
sb.append(" <li class=\"pageinfo\">首页</li>\n");
sb.append(" <li class=\"pageinfo\">上页</li>\n");
} else {
sb.append(" <li><a href=\"#@\" οnclick=\"nextPage(1)\">首页</a></li>\n");
sb.append(" <li><a href=\"#@\" οnclick=\"nextPage(" + (currentPage - 1)
+ ")\">上页</a></li>\n");
}
int showTag = 3; // 分页标签显示数量
int startTag = 1;
if (currentPage > showTag) {
startTag = currentPage - 1;
}
int endTag = startTag + showTag - 1;
for (int i = startTag; i <= totalPage && i <= endTag; i++) {
if (currentPage == i) {
sb.append("<li class=\"current\">" + i + "</li>\n");
} else {
sb.append(" <li><a href=\"#@\" οnclick=\"nextPage(" + i + ")\">" + i
+ "</a></li>\n");
}
}
if (currentPage == totalPage) {
sb.append(" <li class=\"pageinfo\">下页</li>\n");
sb.append(" <li class=\"pageinfo\">尾页</li>\n");
} else {
sb.append(" <li><a href=\"#@\" οnclick=\"nextPage(" + (currentPage + 1)
+ ")\">下页</a></li>\n");
sb.append(" <li><a href=\"#@\" οnclick=\"nextPage(" + totalPage
+ ")\">尾页</a></li>\n");
}
sb.append(" <li class=\"pageinfo\">第" + currentPage + "页</li>\n");
sb.append(" <li class=\"pageinfo\">共" + totalPage + "页</li>\n");
sb.append("</ul>\n");
sb.append("<script type=\"text/javascript\">\n");
sb.append("function nextPage(page){");
sb.append(" if(true && document.forms[0]){\n");
sb.append(" var url = document.forms[0].getAttribute(\"action\");\n");
sb.append(" if(url.indexOf('?')>-1){url += \"&"
+ (entityOrField ? "currentPage" : "page.currentPage") + "=\";}\n");
sb.append(" else{url += \"?"
+ (entityOrField ? "currentPage" : "page.currentPage") + "=\";}\n");
sb.append(" document.forms[0].action = url+page;\n");
sb.append(" document.forms[0].submit();\n");
sb.append(" }else{\n");
sb.append(" var url = document.location+'';\n");
sb.append(" if(url.indexOf('?')>-1){\n");
sb.append(" if(url.indexOf('currentPage')>-1){\n");
sb.append(" var reg = /currentPage=\\d*/g;\n");
sb.append(" url = url.replace(reg,'currentPage=');\n");
sb.append(" }else{\n");
sb.append(" url += \"&"
+ (entityOrField ? "currentPage" : "page.currentPage") + "=\";\n");
sb.append(" }\n");
sb.append(" }else{url += \"?"
+ (entityOrField ? "currentPage" : "page.currentPage") + "=\";}\n");
sb.append(" document.location = url + page;\n");
sb.append(" }\n");
sb.append("}\n");
sb.append("</script>\n");
}
pageStr = sb.toString();
return pageStr;
}
public void setPageStr(String pageStr) {
this.pageStr = pageStr;
}
public int getShowCount() {
return showCount;
}
public void setShowCount(int showCount) {
this.showCount = showCount;
}
public int getCurrentResult() {
currentResult = (getCurrentPage() - 1) * getShowCount();
if (currentResult < 0) {
currentResult = 0;
}
return currentResult;
}
public void setCurrentResult(int currentResult) {
this.currentResult = currentResult;
}
public boolean isEntityOrField() {
return entityOrField;
}
public void setEntityOrField(boolean entityOrField) {
this.entityOrField = entityOrField;
}
}
package com.curiousby.util;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 分页返回数据
* @see com.curiousby.RestPage
* @author baoyou E-mail:curiousby@163.com
* @version 2017年3月14日 下午4:50:33
* desc:
* @param <T>
*/
public class RestPage<T> implements Serializable {
private static final long serialVersionUID = 5826522161371444844L;
private List<T> list; // 对象记录结果集
private int pages = 0; // 总页数
private int limit = 10; // 每页显示记录数
private int pageNumber = 1; // 当前页
private long totalResults = 0; // 总记录数
private int navigatePages = 5; // 导航页码数
private boolean isLastPage = false; // 是否为最后一页
private boolean isFirstPage = false; // 是否为第一页
private boolean hasNextPage = false; // 是否有下一页
private boolean hasPreviousPage = false; // 是否有前一页
private Integer[] navigatePageNumbers; // 所有导航页号
private HashMap<String, Object> otherHash; //新增结果集
public RestPage() {
}
public RestPage(long total, int pageNumber) {
init(total, pageNumber, limit);
}
public RestPage(long total, int pageNumber, int limit) {
init(total, pageNumber, limit);
}
public RestPage(Page page) {
if (page != null) {
init(page.getTotalResult(), page.getCurrentPage(), page.getShowCount());
} else {
init(0, 0, 0);
}
}
/**
* @param params[count,pageNo,maxRow]
*/
public RestPage(Map<String, Object> params) {
if (null == params.get("count")) {
init(0, params.get("pageNo") == null ? 0 : (Integer) params.get("pageNo"),
params.get("maxRow") == null ? 0 : (Integer) params.get("maxRow"));
} else {
init(Long.parseLong(params.get("count").toString()), (Integer) params.get("pageNo"),
(Integer) params.get("maxRow"));
}
}
private void init(long total, int pageNumber, int limit) {
// 设置基本参数
this.totalResults = total;
this.limit = limit;
if (this.totalResults != 0) {
this.pages = (int) ((this.totalResults - 1) / this.limit + 1);
} else {
this.pages = 0;
}
// 根据输入可能错误的当前号码进行自动纠正
if (pageNumber < 1) {
this.pageNumber = 1;
} else if (pageNumber > this.pages) {
this.pageNumber = this.pages;
} else {
this.pageNumber = pageNumber;
}
// 基本参数设定之后进行导航页面的计算
calcNavigatePageNumbers();
// 以及页面边界的判定
judgePageBoudary();
}
/**
* 计算导航页
*/
private void calcNavigatePageNumbers() {
// 当总页数小于或等于导航页码数时
if (pages <= navigatePages) {
navigatePageNumbers = new Integer[pages];
for (int i = 0; i < pages; i++) {
navigatePageNumbers[i] = i + 1;
}
} else { // 当总页数大于导航页码数时
navigatePageNumbers = new Integer[navigatePages];
int startNum = pageNumber - navigatePages / 2;
int endNum = pageNumber + navigatePages / 2;
if (startNum < 1) {
startNum = 1;
// (最前navigatePages页
for (int i = 0; i < navigatePages; i++) {
navigatePageNumbers[i] = startNum++;
}
} else if (endNum > pages) {
endNum = pages;
// 最后navigatePages页
for (int i = navigatePages - 1; i >= 0; i--) {
navigatePageNumbers[i] = endNum--;
}
} else {
// 所有中间页
for (int i = 0; i < navigatePages; i++) {
navigatePageNumbers[i] = startNum++;
}
}
}
}
/**
* 判定页面边界
*/
private void judgePageBoudary() {
isFirstPage = pageNumber == 1;
isLastPage = pageNumber == pages && pageNumber != 1;
hasPreviousPage = pageNumber > 1;
hasNextPage = pageNumber < pages;
}
public void setList(List<T> list) {
this.list = list;
}
/**
* 设置结果集返回分页对象
* @return RestPage<T>
*/
public RestPage<T> setListAndReturn(List<T> list) {
this.list = list;
return this;
}
/**
* 得到当前页的内容
* @return {List}
*/
public List<T> getList() {
return null == list ? new ArrayList<T>() : list;
}
public HashMap<String, Object> getOtherHash() {
return otherHash;
}
public RestPage<T> setOtherHash(HashMap<String, Object> otherHash) {
this.otherHash = otherHash;
return this;
}
/**
* 得到记录总数
* @return long
*/
public long getTotalResults() {
return totalResults;
}
/**
* 得到每页显示多少条记录
* @return {int}
*/
public int getLimit() {
return limit;
}
/**
* 得到页面总数
*
* @return {int}
*/
public int getPages() {
return pages;
}
/**
* 得到当前页号
*
* @return {int}
*/
public int getPageNumber() {
return pageNumber;
}
/**
* 得到所有导航页号
*
* @return {int[]}
*/
public Integer[] getNavigatePageNumbers() {
return navigatePageNumbers;
}
public boolean isFirstPage() {
return isFirstPage;
}
public boolean isLastPage() {
return isLastPage;
}
/**
*
* @return
*/
public boolean hasPreviousPage() {
return hasPreviousPage;
}
/**
*
* @return
*/
public boolean hasNextPage() {
return hasNextPage;
}
/**
*
*/
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("[").append("total=").append(totalResults).append(",pages=").append(pages)
.append(",pageNumber=").append(pageNumber).append(",limit=").append(limit)
.append(",isFirstPage=").append(isFirstPage).append(",isLastPage=")
.append(isLastPage).append(",hasPreviousPage=").append(hasPreviousPage)
.append(",hasNextPage=").append(hasNextPage).append(",navigatePageNumbers=");
int len = navigatePageNumbers.length;
if (len > 0) {
sb.append(navigatePageNumbers[0]);
}
for (int i = 1; i < len; i++) {
sb.append(" " + navigatePageNumbers[i]);
}
sb.append(",list.size=" + list.size());
sb.append("]");
return sb.toString();
}
}
pageinfo
public class PageInfo {
int pageNum = Constants.DEFAUL_PAGE_NUM; // 页号
int pageSize = Constants.DEFAUL_PAGE_SIZE; // 每页数据条数
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
}
mapper
public interface UserMapper {
RestPage<User> listPage(Map<String, Object> map) ;
}
controller
@RequestMapping(value = "/all")
@ResponseBody
public RestPage<User> all(PageInfo page){
Map<String, Object> filter = new HashMap<String, Object>();
page.setPageSize(1);
filter.put("pageNo", page.getPageNum());
filter.put("maxRow", page.getPageSize());
RestPage<User> listPage = userService.listPage(filter);
return listPage;
}
捐助开发者
在兴趣的驱动下,写一个免费
的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(右上角的爱心标志,支持支付宝和微信捐助),没钱捧个人场,谢谢各位。
谢谢您的赞助,我会做的更好!