Java分页原理_分页系统原理

Java分页原理_分页系统原理Java分页常见的分页实现方式使用List接口中的subList(intstartIndex,intendIndex)方法实现分页直接使用数据库SQL语句实现分页使用hibernate等框架实现跨数据库的分页使用subList()实现分页使用数据库SQL语句实现分页mysql数据库使用limit关键字,oracle中使用rownum关键字。例如,从学生表(

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

Java分页

常见的分页类型:

  • 传统的:采用传统的分页方式,可以明确的获取数据信息,如有多少条数据,分多少页显示等。
  • 下拉式:采用下拉式的分页方式,一般无法获取明确的数据数量相关的信息,但在分页操作以后,任然可以看到之前查询的数据。

常见的分页实现方式:

  • 使用List接口中的subList(int startIndex, int endIndex)方法实现分页
  • 直接使用数据库SQL语句实现分页
  • 使用hibernate等框架实现跨数据库的分页

使用subList()实现分页

使用的是List接口中的subList(int startIndex, int endIndex)方法,返回列表中指定的fromIndex(包括)和endIndex(不包括)之间的部分视图。

使用subList()

使用数据库SQL语句实现分页
mysql数据库使用limit关键字,oracle中使用rownum关键字。
例如,从学生表(t_student)中查询出前十条数据
MySql查询语句

select * from t_student limit 0, 10

表示的是从第0条开始取,取10条记录。

PostgreSQL查询语句

select * from t_student limit 10 offset 0

Oracle查询语句
Oracle查询语句

使用hibernate框架实现跨数据库的分页
使用hibernate框架实现跨数据库的分页

分页实现方式的比较
分页实现方式的比较

实现方式

模型对象

处理映射数据表的对象外,还要创建一个Pager分页对象,其大致的内容如下:

package com.imooc.page.model;

import java.io.Serializable;
import java.util.List;

public class Pager<T> implements Serializable {

    private static final long serialVersionUID = -8741766802354222579L;

    //每页显示多少条记录
    private int pageSize;
    //当前第几页数据
    private int currentPage;
    //一共有多少条记录
    private int totalRecord;
    //一共多少页记录
    private int totalPage;
    //要显示的数据,使用泛型
    private List<T> dataList;

    public Pager() {
        super();
    }

    public Pager(int pageSize, int currentPage, int totalRecord, int totalPage, List<T> dataList) {
        super();
        this.pageSize = pageSize;
        this.currentPage = currentPage;
        this.totalRecord = totalRecord;
        this.totalPage = totalPage;
        this.dataList = dataList;
    }

    public Pager(int pageNum, int pageSize, List<T> sourceList){
        if (sourceList == null){
            return;
        }

        //总记录条数
        this.totalRecord = sourceList.size();
        //每页显示多少条记录
        this.pageSize = pageSize;
        //获取总页数
        this.totalPage = this.totalRecord / this.pageSize;
        if (this.totalRecord % this.pageSize != 0) {
            this.totalPage += 1;
        }

        //当前第几页数据
        this.currentPage = this.totalPage < pageNum ? this.totalPage : pageNum;

        //起始索引
        int fromIndex = this.pageSize * (this.currentPage - 1);
        //结束索引
        int toIndex =this.pageSize * this.currentPage > this.totalRecord ?  this.totalRecord :  this.pageSize * this.currentPage;

        this.dataList = sourceList.subList(fromIndex, toIndex);
    }

    public int getPageSize() {
        return pageSize;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    public int getCurrentPage() {
        return currentPage;
    }
    public void setCurrentPage(int currentPage) {
        this.currentPage = currentPage;
    }
    public int getTotalRecord() {
        return totalRecord;
    }
    public void setTotalRecord(int totalRecord) {
        this.totalRecord = totalRecord;
    }
    public int getTotalPage() {
        return totalPage;
    }
    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }
    public List<T> getDataList() {
        return dataList;
    }
    public void setDataList(List<T> dataList) {
        this.dataList = dataList;
    }
    public static long getSerialversionuid() {
        return serialVersionUID;
    }



}

hibernate分页

Dao的实现如下:

package com.imooc.page.dao;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.hibernate.Session;

import com.imooc.page.Constant;
import com.imooc.page.HibernateSessionFactory;
import com.imooc.page.model.Pager;
import com.imooc.page.model.Student;

public class HibernateStudentDaoImpl implements StudentDao{

    @SuppressWarnings("unchecked")
    @Override
    public Pager<Student> findStudent(Student searchModel, int pageNum, int pageSize) {
        Pager<Student> result = null;

        //存放查询参数
        Map<String, Object> paramMap = new HashMap<String, Object>();

        String stuName = searchModel.getStuName();
        int gender = searchModel.getGender();

        StringBuilder hql = new StringBuilder(" from Student where 1=1");
        StringBuilder countHql = new StringBuilder("select count(id) from Student where 1=1");

        if(stuName != null && !stuName.equals("")){
            hql.append(" and stuName like :stuName");
            countHql.append(" and stuName like :stuName");
            paramMap.put("stuName","%" + stuName + "%");
        }

        if(gender == Constant.GENDER_MALE  || gender == Constant.GENDER_FEMALE){
            hql.append(" and gender = :gender");
            countHql.append(" and gender = :gender");
            paramMap.put("gender",gender);
        }

        //起始索引
        int fromIndex = pageSize * (pageNum - 1);

        List<Student> studentList = new ArrayList<Student>();

        Session session = null;

        try {

            session = HibernateSessionFactory.getSession();
            //获取query对象
            Query hqlQuery = session.createQuery(hql.toString());
            Query countHqlQuery = session.createQuery(countHql.toString());
            //设置查询参数
            setQueryParams(hqlQuery, paramMap);
            setQueryParams(countHqlQuery, paramMap);

            //从第几条记录开始查询
            hqlQuery.setFirstResult(fromIndex);
            //一共查询多少条记录
            hqlQuery.setMaxResults(pageSize);

            //获取查询的结果
            studentList = hqlQuery.list();
            //获取总计条数
            List<?> countResult = countHqlQuery.list();

            int totalRecord = ((Number)countResult.get(0)).intValue();
            //获取总页数
            int totalPage = totalRecord / pageSize;
            if (totalRecord % pageSize != 0) {
                totalPage += 1;
            }

            //组装pager
            result  = new Pager<>(pageSize, pageNum, totalRecord, totalPage, studentList);


        } catch (Exception e) {
            throw new RuntimeException("查询所有数据异常!", e);
        }finally {
            if (session != null) {
                HibernateSessionFactory.closeSession();
            }
        }

        return result;  
    }

    /**
     * 设置查询参数
     * @param query
     * @param paramMap
     * @return
     */
    private Query setQueryParams(Query query, Map<String, Object> paramMap){
        if(paramMap != null && !paramMap.isEmpty()){
            for(Map.Entry<String, Object> param : paramMap.entrySet()){
                query.setParameter(param.getKey(), param.getValue());
            }
        }
        return query;
    }

}

对应的Servlet如下,这里使用到了fastjson返回json数据:

package com.imooc.page.servlet;

import java.io.IOException;
import java.io.Writer;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.alibaba.fastjson.JSON;
import com.imooc.page.Constant;
import com.imooc.page.model.Pager;
import com.imooc.page.model.Student;
import com.imooc.page.service.HibernateStudentServiceImpl;
import com.imooc.page.service.StudentService;
import com.imooc.page.util.StringUtil;

public class HibernateDataServlet extends HttpServlet {

    private StudentService studentService = new HibernateStudentServiceImpl();

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 接收request里的参数
        String stuName = request.getParameter("stuName"); //学生姓名

        // 获取学生性别
        int gender = Constant.DEFAULT_GENDER;
        String genderStr = request.getParameter("gender");
        if(genderStr!=null && !"".equals(genderStr.trim())){
            gender = Integer.parseInt(genderStr);
        }

        // 校验pageNum参数输入合法性
        String pageNumStr = request.getParameter("pageNum"); 
        if(pageNumStr !=null && !StringUtil.isNum(pageNumStr)){
            request.setAttribute("errorMsg", "参数传输错误");
            request.getRequestDispatcher("jdbcSqlStudent.jsp").forward(request, response);
            return;
        }

        int pageNum = Constant.DEFAULT_PAGE_NUM; //显示第几页数据
        if(pageNumStr!=null && !"".equals(pageNumStr.trim())){
            pageNum = Integer.parseInt(pageNumStr);
        }

        int pageSize = Constant.DEFAULT_PAGE_SIZE;  // 每页显示多少条记录
        String pageSizeStr = request.getParameter("pageSize");
        if(pageSizeStr!=null && !"".equals(pageSizeStr.trim())){
            pageSize = Integer.parseInt(pageSizeStr);
        }

        // 组装查询条件
        Student searchModel = new Student(); 
        searchModel.setStuName(stuName);
        searchModel.setGender(gender);

        //调用service 获取查询结果
        Pager<Student> result = studentService.findStudent(searchModel, 
                                                                pageNum, pageSize);
        //不使用缓存
        response.setHeader("Cache-Control", "no-cache");  
        response.setHeader("Pragma", "no-cache");  
        //设置超时时间为0
        response.setDateHeader("Expires", 0);  
        //设置编码格式为utf-8
        response.setContentType("text/html;charset=utf-8");

        //获取查询数据的json格式
        String responseStr = JSON.toJSONString(result);
        //写入数据到response
        Writer writer = response.getWriter();
        writer.write(responseStr);
        writer.flush();
    }

    public static void main(String[] args) {
        String s = String.format("%05d", 123);
        System.out.println(s);
    }

}

分页插件

参考

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/186205.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ubuntu的ssh连不上_ubuntu网络连接没有显示出来

    ubuntu的ssh连不上_ubuntu网络连接没有显示出来之前发在其他的博客上的,现在移动以下位置之前的链接:http://blog.chinaunix.net/uid-69944074-id-5831708.html(原创文章)使用Ubuntu,经常需要需要SSH远程连接,但是有时候会出现问题,难以捉摸,下面参考别人的,在结合自己的尝试总结下吧。服务器配完ubuntu系统以及LNMP环境以后,想用WINSCP远程登录,就需要开启SSH服务才能支持。SSH服务分为客户端和服务器。顾名思义,我想用putty远程登录Ubuntu服务器,所以需要安装SSH s

    2022年8月8日
    8
  • sql嵌套查询例子_sql的多表数据嵌套查询

    sql嵌套查询例子_sql的多表数据嵌套查询SQL嵌套查询示例现需要查询学生上课人数超过“EasternHeretic”的任意一门课的学生人数的课程信息,请使用ANY操作符实现多行子查询。(Lintcode刷题记录)

    2022年8月10日
    7
  • 2017双11核心技术揭秘—双十一海量数据下EagleEye的使命和挑战[通俗易懂]

    2017双11核心技术揭秘—双十一海量数据下EagleEye的使命和挑战[通俗易懂]公众号推荐:公众号:VOA英语每日一听微信号:voahk01可长按扫码关注,谢谢

    2022年8月16日
    4
  • 从日记到博客

    从日记到博客我自零八年上大学开始主动写日记,记录一些自己的想法。我特别喜欢在纸上写字的感觉。我会在纸上记录一些想法和反思,自己新见识的事物、经历,与人接触的小摩擦,待人接物的新想法,也有自己的情感的。当看看最初的日记的时候,觉得当时的想法还非常的幼稚。后来经历的一些事情给我很多困惑、苦恼、启发、激励,帮我建立对人、对事的态度和认知。如果不是这些文字,过去的我是什么样子,会有什么样的想法,早就完全忘记了。正是这…

    2022年5月18日
    34
  • Tomcat调优和JVM优化[通俗易懂]

    Tomcat调优和JVM优化[通俗易懂]Tomcat本身优化工作方式选择为了提升性能,首先就要对代码进行动静分离,让Tomcat只负责jsp文件的解析工作。如采用Apache和Tomcat的整合方式,他们之间的连接方案有三种选择,JK、http_proxy和ajp_proxy。相对于JK的连接方式,后两种在配置上比较简单的,灵活性方面也一点都不逊色。但就稳定性而言不像JK这样久经考验,所以建议…

    2022年6月7日
    33
  • 2022考研数学二考试大纲最新_数学二线性代数考研大纲

    2022考研数学二考试大纲最新_数学二线性代数考研大纲2022年数学二考试大纲考试形式和试卷结构一、试卷满分及考试时间二、答题方式三、试卷内容结构四、试卷题型结构高等数学一、函数、极限、连续二、一元函数微分学三、一元函数积分学四、多元函数微积分学五、常微分方程线性代数一、行列式二、矩阵三、向量四、线性方程组五、矩阵的特征值及特征向量六、二次型考试科目:高等数学、线性代数考试形式和试卷结构一、试卷满分及考试时间试卷满分为150分,考试时间为180分钟.二、答题方式答题方式为闭卷、笔试.三、试卷内容结构高等教学 约80%线性代数 约20%四、试

    2022年8月11日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号