Spring+mybatis+PageHelper分页插件PageHelper的使用

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值