前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java分页原理_分页系统原理

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

作者头像
全栈程序员站长
发布于 2022-11-09 08:14:43
发布于 2022-11-09 08:14:43
2K00
代码可运行
举报
运行总次数:0
代码可运行

Java分页

常见的分页类型:

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

常见的分页实现方式:

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

使用subList()实现分页

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from t_student limit 0, 10

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

PostgreSQL查询语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from t_student limit 10 offset 0

Oracle查询语句

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

分页实现方式的比较

实现方式

模型对象

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的实现如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.cn/186205.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月3日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java分页
    • 实现方式
      • 模型对象
      • hibernate分页
    • 分页插件
    • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档