Java分頁原理
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查詢語句
select * from t_student limit 0, 10
表示的是從第0
條開始取,取10
條記錄。
PostgreSQL查詢語句
select * from t_student limit 10 offset 0
Oracle查詢語句
使用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類用於頁面的操作,例如上一頁、下一頁、跳轉等。 經驗不足,寫的程式碼很