自己對分頁的理解
最近要啟動一個比較大的專案了。回憶以前做的那些web專案,快樂,痛苦,成功,失敗都是經歷過了。
好久沒動那些web了,都塊忘記這麼設計了,今天在java重新找出一些關於hibernate分頁的帖子,受益良多。
robbin大哥的說的最詳細的 www.iteye.com/topic/14657
www.iteye.com/topic/17857
哈哈,有時間多複習是不錯的。
分頁的主要思想是:
1:構造一個Page物件,把相關的屬性設定好,比如記錄數,每頁包含條數,是否有下一頁,是否有上一頁,當前頁,總頁數等,然後通過Page工廠生成一個Page物件(構造的前題是:你必須知道記錄總數,一般從資料中獲取),最後通過對於資料庫的分頁語句得到結果,比如hibernate分頁的寫法是:
這樣做的充分利用資料各自的特性,提供效能。
2:直接從資料load出所有資料,然後再對結果集進行處理。
對所有資料的操作都是用一條語句就ok了,方便處理,缺點是,資料量大的時候效能會有影響。而且每次都去load這麼多資料,不合理。看看程式碼,很簡單
3:採用快取的機制,使用者在第一次查詢的時候把查詢結果存入快取中,這樣使用者下載下一頁的時候,就不用再去從資料庫中查詢,也可以通過第一中方法,先查詢,然後在存入快取,可以這樣理解,智慧的記錄使用者的操作,如果使用者有重複操作就可以把上次的操作結果展示給使用者
好久沒動那些web了,都塊忘記這麼設計了,今天在java重新找出一些關於hibernate分頁的帖子,受益良多。
robbin大哥的說的最詳細的 www.iteye.com/topic/14657
www.iteye.com/topic/17857
哈哈,有時間多複習是不錯的。
分頁的主要思想是:
1:構造一個Page物件,把相關的屬性設定好,比如記錄數,每頁包含條數,是否有下一頁,是否有上一頁,當前頁,總頁數等,然後通過Page工廠生成一個Page物件(構造的前題是:你必須知道記錄總數,一般從資料中獲取),最後通過對於資料庫的分頁語句得到結果,比如hibernate分頁的寫法是:
java 程式碼
- String querySentence = "FROM user in class com.adt.po.User";
- Query query = getSession().createQuery(querySentence);
- query.setFirstResult(page.getBeginIndex())
- .setMaxResults(page.getEveryPage());
- return query.list();
2:直接從資料load出所有資料,然後再對結果集進行處理。
對所有資料的操作都是用一條語句就ok了,方便處理,缺點是,資料量大的時候效能會有影響。而且每次都去load這麼多資料,不合理。看看程式碼,很簡單
java 程式碼
- /**
- * @author wuhua
- *
- * 分頁程式碼,實現策略是,用List類來儲存所有物件,並以page為分頁標記
- */
- import java.util.List;
- public class PageModel {
- private int page = 1; // 當前頁
- public int totalPages = 0; // 總頁數
- private int pageRecorders;// 每頁5條資料
- private int totalRows = 0; // 總資料數
- private int pageStartRow = 0;// 每頁的起始數
- private int pageEndRow = 0; // 每頁顯示資料的終止數
- private boolean hasNextPage = false; // 是否有下一頁
- private boolean hasPreviousPage = false; // 是否有前一頁
- private List list;
- // private Iterator it;
- public PageModel(List list, int pageRecorders) {
- init(list, pageRecorders);// 通過物件集,記錄總數劃分
- }
- /**
- *
- */
- public PageModel() {
- }
- /**
- * @param list
- * @param pageRecorders
- */
- public void init(List list, int pageRecorders) {
- this.pageRecorders = pageRecorders;
- this.list = list;
- totalRows = list.size();
- // it = list.iterator();
- hasPreviousPage = false;
- if ((totalRows % pageRecorders) == 0) {
- totalPages = totalRows / pageRecorders;
- } else {
- totalPages = totalRows / pageRecorders + 1;
- }
- if (page >= totalPages) {
- hasNextPage = false;
- } else {
- hasNextPage = true;
- }
- if (totalRows < pageRecorders) {
- this.pageStartRow = 0;
- this.pageEndRow = totalRows;
- } else {
- this.pageStartRow = 0;
- this.pageEndRow = pageRecorders;
- }
- }
- /**
- * @return 返回 page。
- */
- public int getPage() {
- return page;
- }
- /**
- * @param page
- * 要設定的 page。
- */
- public void setPage(int page) {
- this.page = page;
- }
- /**
- * @return Returns the pageRecorders.
- */
- public int getPageRecorders() {
- return pageRecorders;
- }
- /**
- * @param pageRecorders
- * The pageRecorders to set.
- */
- public void setPageRecorders(int pageRecorders) {
- this.pageRecorders = pageRecorders;
- }
- /**
- * @return Returns the pageEndRow.
- */
- public int getPageEndRow() {
- return pageEndRow;
- }
- /**
- * @return Returns the pageStartRow.
- */
- public int getPageStartRow() {
- return pageStartRow;
- }
- /**
- * @return Returns the totalPages.
- */
- public String getTotalPages() {
- return this.toString(totalPages);
- }
- /**
- * @return Returns the totalRows.
- */
- public String getTotalRows() {
- return this.toString(totalRows);
- }
- /**
- * @return Returns the hasNextPage.
- */
- public boolean isHasNextPage() {
- return hasNextPage;
- }
- /**
- * @param hasNextPage
- * The hasNextPage to set.
- */
- public void setHasNextPage(boolean hasNextPage) {
- this.hasNextPage = hasNextPage;
- }
- /**
- * @return Returns the hasPreviousPage.
- */
- public boolean isHasPreviousPage() {
- return hasPreviousPage;
- }
- // 判斷要不要分頁
- public boolean isNext() {
- return list.size() > 8;
- }
- /**
- * @param hasPreviousPage
- * The hasPreviousPage to set.
- */
- public void setHasPreviousPage(boolean hasPreviousPage) {
- this.hasPreviousPage = hasPreviousPage;
- }
- public String toString(int temp) {
- String str = Integer.toString(temp);
- return str;
- }
- public void description() {
- String description = "共有資料數:" + this.getTotalRows() +
- "共有頁數: " + this.getTotalPages() +
- "當前頁數為:" + this.getPage() +
- " 是否有前一頁: " + this.isHasPreviousPage() +
- " 是否有下一頁:" + this.isHasNextPage() +
- " 開始行數:" + this.getPageStartRow() +
- " 終止行數:" + this.getPageEndRow();
- System.out.println(description);
- }
- public List getNextPage() {
- page = page + 1;
- disposePage();
- System.out.println("使用者凋用的是第" + page + "頁");
- this.description();
- return getObjects(page);
- }
- /**
- * 處理分頁
- */
- private void disposePage() {
- if (page == 0) {
- page = 1;
- }
- if ((page - 1) > 0) {
- hasPreviousPage = true;
- } else {
- hasPreviousPage = false;
- }
- if (page >= totalPages) {
- hasNextPage = false;
- } else {
- hasNextPage = true;
- }
- }
- public List getPreviousPage() {
- page = page - 1;
- if ((page - 1) > 0) {
- hasPreviousPage = true;
- } else {
- hasPreviousPage = false;
- }
- if (page >= totalPages) {
- hasNextPage = false;
- } else {
- hasNextPage = true;
- }
- this.description();
- return getObjects(page);
- }
- /**
- * 獲取第幾頁的內容
- *
- * @param page
- * @return
- */
- public List getObjects(int page) {
- if (page == 0)
- this.setPage(1);
- else
- this.setPage(page);
- this.disposePage();
- if (page * pageRecorders < totalRows) {// 判斷是否為最後一頁
- pageEndRow = page * pageRecorders;
- pageStartRow = pageEndRow - pageRecorders;
- } else {
- pageEndRow = totalRows;
- pageStartRow = pageRecorders * (totalPages - 1);
- }
- List objects = null;
- if (!list.isEmpty()) {
- objects = list.subList(pageStartRow, pageEndRow);
- }
- this.description();
- return objects;
- }
- public List getFistPage() {
- if (this.isNext()) {
- return list.subList(0, pageRecorders);
- } else {
- return list;
- }
- }
- /**
- * @return 返回 list。
- */
- public List getList() {
- return list;
- }
- /**
- * @param list
- * 要設定的 list。
- */
- public void setList(List list) {
- this.list = list;
- }
- /**
- * @param totalRows
- * 要設定的 totalRows。
- */
- public void setTotalRows(int totalRows) {
- this.totalRows = totalRows;
- }
- }
3:採用快取的機制,使用者在第一次查詢的時候把查詢結果存入快取中,這樣使用者下載下一頁的時候,就不用再去從資料庫中查詢,也可以通過第一中方法,先查詢,然後在存入快取,可以這樣理解,智慧的記錄使用者的操作,如果使用者有重複操作就可以把上次的操作結果展示給使用者
相關文章
- 自己對Binder的理解
- 小結自己對BFC的理解
- 如何提升自己對問題的理解深度?
- 自己對Java中if變數賦值的理解Java變數賦值
- 什麼是對分散式系統有自己的理解分散式
- Hibernate分頁查詢原理解讀
- Java -- 對List集合進行分頁Java
- 知乎引流軟體?小帥說說自己對知乎軟體的理解
- oracle將對自己產品的漏洞劃分級別(轉)Oracle
- [提問交流]希望加入對分頁路由的解析路由
- RocketMQ 自己的整理和理解MQ
- github 建立自己的主頁Github
- 嘗試自己動手用react來寫一個分頁元件React元件
- C語言小白 記錄自己對一些概念的理解 若有錯誤 多包涵 若能指正 萬分感激C語言
- 「Laravel 服務容器」自己的理解Laravel
- RSA演算法,自己的理解!演算法
- Django的分頁Django
- mysql分頁-limit offset分頁MySqlMIT
- 自己理解的TCP三次握手TCP
- 對 REST 的理解REST
- 對rose 的理解ROS
- 對Join的理解
- Hive——分桶的理解Hive
- 說說自己對於 MySQL 常見的兩種儲存引擎:MyISAM與 InnoDB的理解MySql儲存引擎
- 戒賭心德個人對彩票的理解-回血上岸取決於自己的心態
- 分庫分表後的分頁查詢
- ssh的分頁操作
- Oracle的特性分頁Oracle
- 分頁的實現
- hibernate 通用分頁,查詢分頁的泛型類泛型
- 分頁總頁數計算方法 所有分頁通用
- flask 分頁 | 翻頁Flask
- 自己理解的例項恢復步驟
- 作業系統(自己理解)作業系統
- 我對抽象的理解抽象
- 對於BFC的理解
- 對事務的理解
- 對於MVVM的理解MVVM