1. 程式人生 > >Java分頁原理

Java分頁原理

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);
    }

}

分頁外掛

參考

相關推薦

Java原理

Java分頁 常見的分頁型別: 傳統的:採用傳統的分頁方式,可以明確的獲取資料資訊,如有多少條資料,分多少頁顯示等。 下拉式:採用下拉式的分頁方式,一般無法獲取明確的資料數量相關的資訊,但在分頁操作以後,任然可以看到之前查詢的資料。 常見的分頁實現方式

Java 原理(上)

現在 分享圖片 inf bubuko 9.png 原理 src 查詢 mage Java web 實習需要用到分頁技術 所以現在學習一下 做個記錄 方便以後查閱 分類:傳統分頁技術 下拉式分頁技術 起始位置(0)開始 查詢(10條記錄)

java的實現,外掛PageHelper的使用及原理

如果你只希望知道PageHelper的用法,直接去github檢視官網文件 Mybatis-PageHelper. 1.關於分頁。 在web專案中,分頁是一個常見的功能。在我剛學完javaweb的時候在沒有用任何框架的情況下做過分頁,程式碼非常的冗餘、難看,後臺每個POJ

java 代碼

repl urn inline ntp pla current bmi spa clas java======================== /** * 分頁實體類 * @version [版本號, Nov 9, 2011] */public class Page {

Java查詢--顯示

limit href agen dex lec return 出現 初始化 public   當數據庫中數據條數過多時,一個頁面就不能顯示,這是要設置分頁查詢,首先要使用的是數據庫sql語句的limit條件實現分組查詢sql語句大概形式為:   select * from

java的實現(後臺工具類和前臺jsp頁面)

cal else static pre cti per servle reac tint 1、首先,新建一個類Page.java 1 public class Page implements Serializable { 2 private static fi

php下的原理學習

art 查詢 鏈接 ror www. 不可 生成 path count **首先確定分頁需要確定的參數數據**`page 當前頁碼``pageSize 每一頁的條數``total_count 總共的數據條數``pageNumber = ceil ( totalCount /

原理淺析

++ 就是 end IV lds 記錄 bject 偽代碼 請求 1.關於分頁只討論分頁,即顯示數據,不做任何過濾(搜索)和排序,僅僅是顯示數據 1.1hibernate的分頁 mysql用limit來作分頁,核心參數有兩個,start與size,即開始的位置與每頁顯示

前端原理

這裡講解一下滾動分頁的常用的兩種方法: 方法一: <script type="text/javascript"> var page = 2; //當前頁的頁碼 var flagNoData = false; //false

淺析pagehelper原理

原文連結 https://blog.csdn.net/qq_21996541/article/details/79796117   之前專案一直使用的是普元框架,最近公司專案搭建了新框架,主要是由公司的大佬搭建的,以springboot為基礎。為了多學習點東西,我也模仿他搭了一套自

MyBatis攔截器原理及PageHelper外掛教學

閒來無事,特地整理了一下MyBatis攔截器實現分頁的原理。 地球人應該都知道要利用JDBC對資料庫進行操作,就需要一個statement物件,MyBatis也是如此。MyBatis在執行sql語句前會產生一個包含sql語句的Statement物件,而且對應的

Mybatis邏輯原理解析RowBounds

Mybatis提供了一個簡單的邏輯分頁使用類RowBounds(物理分頁當然就是我們在sql語句中指定limit和offset值),在DefaultSqlSession提供的某些查詢介面中我們可以看到RowBounds是作為引數用來進行分頁的,如下介面: public <

Mybatis 邏輯原理解析rowbounds

Mybatis提供了一個簡單的邏輯分頁使用類RowBounds(物理分頁當然就是我們在sql語句中指定limit和offset值),在DefaultSqlSession提供的某些查詢介面中我們可以看到RowBounds是作為引數用來進行分頁的,如下介面:public <

java的寫法

第一步:       首先需要到如各部分歲對應的包,例如資料庫驅動的包,實體類的包,c3p0的包,以及c3p0的配置檔案       建立資料庫,建立資料庫所對應的一個實體類,例如:student類,裡邊包含私有的屬性,及set和get方法 第二步:     建立另一個關

java查詢(oracle)dao樣例

/** * 根據使用者ID和時間範圍查詢條件得到相關記錄 * @author Bimy * @created 2015年6月23日 * @lastModified * @param empCode 員工ID * @param begi

Java技術的實現(一)

(一)建立一個web專案 (二)編寫Java類 1.建立一個com.imooc.page包 package com.imooc.page; public class Constant { /** * 男性 */

PHP原理

在看本文之前,請確保你已掌握了PHP的一些知識以及MYSQL的查詢操作基礎哦。作為一個Web程式,經常要和不計其數的資料打交道,比如會員的資料,文章資料,假如只有幾十個會員那很好辦,在一頁顯示就可以了,可是假如你的網站是幾千甚至幾十萬會員的話,如果都在一頁開啟的話無論對瀏覽器

java 工具類+Mybatis攔截SQL實現

轉載!一個比較好的分頁! /**  * 對Page<E>結果進行包裝  * <p/>  * 新增分頁的多項屬性,主要參考:http://bbs.csdn.net/topics/360010907  * @version 3.3.0

java 工具類 (非常實用的工具類 留用)

import java.util.List; /** * 分頁工具類 * * @author * */ public class PageBean<T> { private List<T> pageData; private Integer cur

java工具類

在最近的專案中需要用到分頁,所以自己寫了個分頁工具。 主要的原理就是將資料庫取出的資料儲存到List中,然後以設定的每頁條數進行逐頁處理。 一共分為兩個類,Page類用於儲存頁面資訊,Pagination類用於頁面的操作,例如上一頁、下一頁、跳轉等。 經驗不足,寫的程式碼很