demo在这里自己可以下载:http://download.csdn.net/download/qq_35514348/10018194
为了更简单的实现数据库分页,我们不探讨自己手动修改sql语句分页,这里关于PageHelper自己配置是出现的问题进行记录下:
我采用的是Maven代码托管,在pom.xml进行如下配置:<!-- Mybatis 分页插件 PageHelper 5.0.2包 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.0.2</version>
</dependency>
如果没有使用Maven工具,则自己手动下载jar包即可 .
spring-mybatis.xml文件中配置:
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:com/wl/goldatg/mapping/*.xml"></property>
<!-- 配置分页插件 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageHelper">
<property name="properties">
<value>
dialect=mysql
reasonable=true
</value>
</property>
</bean>
</array>
</property>
</bean>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置分页插件 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->
<property name="dialect" value="mysql"/>
</plugin>
</plugins>
</configuration>
看你们喜欢用哪一个!
当我们运行项目是,问题就来了,报类似下面的错误:
如图探究呢,当扫描器走到这里是,配置文件无法识别,后续就没有了,停止扫描文件,导致报错;最后反复探究后,配置没有问题,原因的PageHelper的版本问题,修改版本
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.6</version>
</dependency>
上面那些错误我是从别的地方找的,就是告诉大家如遇到此类错误该如何解决。
在此,我们省略实体、service及.xml sql文件的代码。因为你们项目中都会写! 我们直接来看controller层的代码!
/**
*
* @Title: getall
* @Description: TODO(进入首页)
* @author: 海那边天哭了i
* @date: 2017年9月28日 下午3:55:26
* @param: @param user
* @param: @param pn
* @param: @return
* @return: ModelAndView
* @throws
*/
@RequestMapping("/show")
public ModelAndView getall(User user,@RequestParam(value="pn",defaultValue="1") Integer pn){ //pn (page)相当于 第几页开始
ModelAndView mav = new ModelAndView();
// List user = userService.getUser(user);
PageHelper.startPage(pn, 5);
List<User> ulist = userService.getuserList(user);
//默认每页显示5条数据
PageInfo<User> page=new PageInfo<User>(ulist,5);
// System.out.println(p.getList());
mav.addObject("ulist", ulist);
//mav.setViewName("index");
//mav.addObject("citylist", ulist);
mav.addObject("pageInfo", page);
mav.setViewName("show");
return mav;
}
上面代码就是我的controller代码,里面也有注释,注意看。也可以这样写:
@RequestMapping("/show")
public ModelAndView getall(ModelAndView mv,
@RequestParam(required=true,defaultValue="1") Integer pn,
@RequestParam(required=false,defaultValue="5") Integer pageSize){
PageHelper.startPage(pn, pageSize);
[java] view plain copy
List<User> ulist = userService.getuserList(user);
PageInfo<User> p = new PageInfo<User>(ulist);
//System.out.println(p.getList());
mv.addObject("list", list);
mv.addObject("page", p);
mv.setViewName("show");
return mv;
都差不多,只是传的参数不一样而已。。。
可以看到,方法里有两个参数,前面也说了,这是一个demo,仅仅只是一个非常简单的分页效果。
PageHelper.startPage(page, pageSize);
这段代码表示,程序开始分页了,page默认值是1,pageSize默认是5,意思是从第1页开始,每页显示5条记录。
PageInfo这个类是插件里的类,非常方便的调用,分页再次提高性能:
//当前页
private int pageNum;
//每页的数量
private int pageSize;
//当前页的数量
private int size;
//排序
private String orderBy;
//由于startRow和endRow不常用,这里说个具体的用法
//可以在页面中"显示startRow到endRow 共size条数据"
//当前页面第一个元素在数据库中的行号
private int startRow;
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总记录数
private long total;
//总页数
private int pages;
//结果集
private List<T> list;
//第一页
private int firstPage;
//前一页
private int prePage;
//下一页
private int nextPage;
//最后一页
private int lastPage;
//是否为第一页
private boolean isFirstPage = false;
//是否为最后一页
private boolean isLastPage = false;
//是否有前一页
private boolean hasPreviousPage = false;
//是否有下一页
private boolean hasNextPage = false;
//导航页码数
private int navigatePages;
//所有导航页号
private int[] navigatepageNums;
如果嫌多也可以自己整合一个,看你们个人习惯。
使用PageInfo这个类,你需要将查询出来的list放进去:
PageInfo<User> p = new PageInfo<User>(ulist);
然后mv.addObject("page", p);
这样在页面中就可以通过${page.nextPage}翻到下一页, ${page.prePage}翻到上一页,。
这里我写了一个js来判断输入数字来跳到指定页的代码:
function _go() {
var pc = $("#pageCode").val(); //获取文本框中的当前页码
// var place = $("#pageCode").attr('placeholder');
if(!/^[1-9]\d*$/.test(pc)) {//对当前页码进行整数校验
alert('请输入正确的页码!');
return;
}
if(pc > ${pageInfo.pages}) { //判断当前页码是否大于最大页
alert('请输入正确的页码!');
return;
}
window.location.href = "<%=basePath%>user/showall?pn=" + pc;
}
下面是展示页面的样式:
<div>
当前第:${pageInfo.pageNum}页,共:${pageInfo.pages}页,当前显示:${pageInfo.size}条,共:${pageInfo.total}条记录
</div>
<div>
<c:if test="${pageInfo.pages} != 1"></c:if>
<c:if test="${pageInfo.hasPreviousPage }">
<a href="<%=basePath%>tologin/showall?pn=1">首页</a>
<%-- <a href="<%=basePath%>user/showall?pn=${pageInfo.prePage}">上一页</a> --%>
<!-- 判断有无上一页 没有按钮取消展示 -->
<a href="<%=basePath%>tologin/showall?pn=${pageInfo.pageNum-1}">上一页</a>
</c:if>
<!-- 中间显示到的页数 -->
<c:forEach items="${pageInfo.navigatepageNums }" var="page_Num">
<c:if test="${page_Num == pageInfo.pageNum }">
<a href="<%=basePath%>tologin/showall?pn=${ page_Num}">${ page_Num}</a>
</c:if>
<c:if test="${page_Num != pageInfo.pageNum }">
<a href="<%=basePath%>tologin/showall?pn=${ page_Num}">${ page_Num}</a>
</c:if>
</c:forEach>
<!-- 判断有无下一页 没有按钮取消展示 -->
<c:if test="${pageInfo.hasNextPage }">
<a href="<%=basePath%>tologin/showall?pn=${pageInfo.pageNum+1}">下一页</a>
</c:if>
<%-- <a href="<%=basePath%>user/showall?pn=${pageInfo.nextPage}">下一页</a> --%>
<span>到</span> <input type="text" id="pageCode"
<%-- value="${pageInfo.pageNum}" --%> placeholder="列如${pageInfo.pageNum}"
style="width: 40px; height: 25px;" /> <span>页</span> <a
href="javascript:_go();" class="aSubmit">确定</a>
<c:if test="${pageInfo.hasNextPage }">
<a href="<%=basePath%>tologin/showall?pn=${pageInfo.pages}">末页</a>
</c:if>
</div>
上面也得有注释,在这里就不多说了。包括我也加了一个文本框,用户来输入数字跳转到指定页面。
我们来看下页面效果:
样式的话以为我没有嵌套一些前端代码:比如easyUI、bootstrap等等,我就是为了给大家看这个分页插件,就是一个小小的demo。
细心地朋友可能观察到了一些问题。我们当前第一页的时候他没有显示首页、还是上一页。在这里有段代码是判断有无上一页下一页的:
//是否有前一页
private boolean hasPreviousPage = false;
//是否有下一页
private boolean hasNextPage = false;
这些都在封装的那个实体类里了,我们直接使用即可,并且我上面代码土中也有注释,大家可以看看。
好了 整个domo至此结束,到这里就实现了分页的功能和页面跳转的功能,感谢大家观看!谢谢`︶` !
demo在这里自己可以下载:点我下载demo