怎么进行分页数据的查询,如何判断是否有下一页?

为什么用到分页查询?

1、用户体验、页面显示效果:
在开发过程当中,我们经常需要从数据库中查询数据,然后将数据在客户端显示,如果数据量少的话,可以在一个页面上显示完成,但是如果查询的数据是几百条、上千条数据的时候,全部在一个页面上显示出来,非常影响页面的美观性和用户的体验。所以这就用到分页技术。
2、服务器资源、性能:
当数据量过大时,可能会导致各种各样的问题发生,例如:服务器资源被耗尽,因数据传输量过大而使处理超时,等等。最终都会导致查询无法完成当数据量过大时,可能会导致各种各样的问题发生,例如:服务器资源被耗尽,因数据传输量过大而使处理超时,等等。最终都会导致查询无法完成
打一个比方,有很多很多人要过河,而只有一条船摆渡。若让所有人都上船,肯定会导致沉船(资源耗尽);若换一条超大的船,除了换船要很高的成本外,上船下船也要耗费很长时间。
所以最好的解决方法是,根据船的容量,每次只上一部分人。等这一船人过河以后,再摆渡下一批人。
 

2.知识剖析

(一)limit用法

select * from tablename limit #{start},#{size}

start是从哪里开始显示

size是每页显示多少条记录

 

(二)总记录数totalCount

select  count(1) from tablename 

 

(三)总页数

totalPage=totalCount/pageSize

需要用到的参数

private int currPage;//当前页数
private int pageSize;//每页显示的记录数
private int totalCount;//总记录数
private int totalPage;//总页数
private List<StudentCustom> lists;//每页的显示的数据

具体实现

首先建一个pageBean的类

public class PageBean<T> {
    private int currPage;//当前页数
    private int pageSize;//每页显示的记录数
    private int totalCount;//总记录数
    private int totalPage;//总页数
    private List<StudentCustom> lists;//每页的显示的数据

    public int getCurrPage() {
        return currPage;
    }

    public void setCurrPage(int currPage) {
        this.currPage = currPage;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getTotalCount() {
        return totalCount;
    }

    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
    }

    public int getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }

    public List<T> getLists() {
        return (List<T>) lists;
    }

    public void setLists(List<StudentCustom> lists) {
        this.lists = lists;
    }

    @Override
    public String toString() {
        return "PageBean{" +
                "currPage=" + currPage +
                ", pageSize=" + pageSize +
                ", totalCount=" + totalCount +
                ", totalPage=" + totalPage +
                ", lists=" + lists +
                '}';
    }
}

然后我们需要在mapper中配置相应的的sql语句

    <!-- 根据传入参数查找end -->
<!-- 根据分页数据start 和size查询数据 -->
<select id="findByPage" parameterType="Map" resultType="com.jnshu.pojo.StudentCustom">
    select
    *
    from t_stu
    <if test="start!=null and size!=null">
        limit #{start},#{size}
    </if>
</select>

<!-- 查询用户记录总数 -->
<select id="selectCount" resultType="int">
    select count(*) from t_stu
</select>

逻辑层实现方法

@Override
public PageBean<StudentCustom> findByPage(int currentPage) throws Exception {
    HashMap<String, Object> map = new HashMap<String, Object>();
    PageBean<StudentCustom> pageBean = new PageBean<StudentCustom>();

    //封装当前页数
    pageBean.setCurrPage(currentPage);

    //每页显示的数据
    int pageSize = 8;
    pageBean.setPageSize(pageSize);

    //封装总记录数
    int totalCount = studentMapper.selectCount();
    pageBean.setTotalCount(totalCount);

    //封装总页数
    double tc = totalCount;
    Double num = Math.ceil(tc / pageSize);//向上取整,除不尽的时候都向上取整
    pageBean.setTotalPage(num.intValue());

    map.put("start", (currentPage - 1) * pageSize);
    map.put("size", pageBean.getPageSize());
    //封装每页显示的数据
    logger.debug(map);
    List<StudentCustom> lists = studentMapper.findByPage(map);
    pageBean.setLists(lists);
    logger.debug(pageBean);
    return pageBean;

//这里list可以看到输出为对应8条数据,所以我们只需要这些数据显示在jsp页面即可
[Student{studentId=1556, studentName='田安安', studentQq=1256384, studentType='java工程师', studentTime='2018.05.20', studentSchool='武汉大学', studentDailyLink='http://localhost:8080/addStudent', studentWords='好好学习', studentBrother='田晚晚', studentKnow='知乎', create_at=null, update_at=1534657656223}, Student{studentId=1999, studentName='刘均元', studentQq=10001, studentType='java工程师', studentTime='2018.07.15', studentSchool='浠水电大', studentDailyLink='不会写日报', studentWords='杀死所有师兄', studentBrother='刘欢', studentKnow='知乎', create_at=1533949572582, update_at=1534657678564}, Student{studentId=2000, studentName='臻泽懂', studentQq=256791742, studentType='java工程师', studentTime='Sat Aug 18 21:02:01 CST 2018', studentSchool='武汉修真院', studentDailyLink='http://www.jnshu.com/school/22000/daily', studentWords='当一个优秀的it工程师', studentBrother='劲烤', studentKnow='知乎', create_at=1534597321483, update_at=1534658912567}, Student{studentId=2001, studentName='靡腾祟', studentQq=256791743, studentType='java工程师', studentTime='Sat Aug 18 21:02:01 CST 2018', studentSchool='武汉修真院', studentDailyLink='http://www.jnshu.com/school/22001/daily', studentWords='当一个优秀的it工程师', studentBrother='解芽', studentKnow='知乎', create_at=1534597321834, update_at=null}, Student{studentId=2002, studentName='垄殃顾', studentQq=256791744, studentType='java工程师', studentTime='Sat Aug 18 21:02:01 CST 2018', studentSchool='武汉修真院', studentDailyLink='http://www.jnshu.com/school/22002/daily', studentWords='当一个优秀的it工程师', studentBrother='侵够', studentKnow='知乎', create_at=1534597321837, update_at=null}, Student{studentId=2003, studentName='肩弗峡', studentQq=256791745, studentType='java工程师', studentTime='Sat Aug 18 21:02:01 CST 2018', studentSchool='武汉修真院', studentDailyLink='http://www.jnshu.com/school/22003/daily', studentWords='当一个优秀的it工程师', studentBrother='箭帐', studentKnow='知乎', create_at=1534597321838, update_at=null}, Student{studentId=2004, studentName='趾练七', studentQq=256791746, studentType='java工程师', studentTime='Sat Aug 18 21:02:01 CST 2018', studentSchool='武汉修真院', studentDailyLink='http://www.jnshu.com/school/22004/daily', studentWords='当一个优秀的it工程师', studentBrother='毫詹', studentKnow='知乎', create_at=1534597321840, update_at=null}, Student{studentId=2006, studentName='算捻崎', studentQq=256791748, studentType='java工程师', studentTime='Sat Aug 18 21:02:01 CST 2018', studentSchool='武汉修真院', studentDailyLink='http://www.jnshu.com/school/22006/daily', studentWords='当一个优秀的it工程师', studentBrother='糖金', studentKnow='知乎', create_at=1534597321844, update_at=null}]

}

控制层

@RequestMapping(value = "/queryStudents", method = RequestMethod.GET)
public String form(@RequestParam(value="currentPage",defaultValue="1",required=false)int currentPage,Model  model) throws Exception {
    PageBean<StudentCustom> studentList = studentService.findByPage(currentPage);
    studentList.getLists();
    model.addAttribute("studentList", studentList.getLists());//显示页面的数据
    model.addAttribute("pagemsg", studentService.findByPage(currentPage));//显示第几页的及还有多少页之类
    logger.debug(studentService.findByPage(currentPage));
    return "students/studentList";
}

jsp页面

上面表的是自己写的东西,就不贴了

<table border="0" cellspacing="0" cellpadding="0" width="900px">
    <tr>
        <td class="td2">
            <span>第${requestScope.pagemsg.currPage }/ ${requestScope.pagemsg.totalPage}页</span>&nbsp;&nbsp;
            <span>总记录数:${requestScope.pagemsg.totalCount }&nbsp;&nbsp;每页显示:${requestScope.pagemsg.pageSize}</span>&nbsp;&nbsp;
            <span>
       <c:if test="${requestScope.pagemsg.currPage != 1}">
           <a href="${pageContext.request.contextPath }/queryStudents?currentPage=1">[首页]</a>&nbsp;&nbsp;
           <a href="${pageContext.request.contextPath }/queryStudents?currentPage=${requestScope.pagemsg.currPage-1}">[上一页]</a>&nbsp;&nbsp;
       </c:if>

       <c:if test="${requestScope.pagemsg.currPage != requestScope.pagemsg.totalPage}">
           <a href="${pageContext.request.contextPath }/queryStudents?currentPage=${requestScope.pagemsg.currPage+1}">[下一页]</a>&nbsp;&nbsp;
           <a href="${pageContext.request.contextPath }/queryStudents?currentPage=${requestScope.pagemsg.totalPage}">[尾页]</a>&nbsp;&nbsp;
       </c:if>
   </span>
        </td>
    </tr>
</table>

看下效果

物理方法实现分页查询

基本就是这个效果。

 

相关文章:

  • 2021-11-13
  • 2021-05-16
  • 2021-07-12
  • 2021-11-19
  • 2021-11-29
猜你喜欢
  • 2022-12-23
  • 2022-01-11
  • 2021-11-27
  • 2022-12-23
  • 2021-12-18
相关资源
相似解决方案