分頁的應用幾乎無處不在,只要有資料的地方就會用到分頁的技術,關於分頁已經有成熟的架構以及類庫並不需要我們親自些在自己的分頁類,通常用別人的已經開發好的東西,拿來開發效率會高一些,雖然如此,我們還需要掌握並瞭解分頁實現的原理和機制,下面給大家介紹一下,真分頁的實現。
談到分頁在.NET裡面已經接觸過,學過一邊感覺再一次接觸會容易理解和運用,它們的實現思路和思想是一樣的,突然,對編程思想有了些認識,學習編程重要的並不是掌握多少語言,會多少語言,而是理解了編程的思想,如果你擁有了思想,編程是很輕鬆的事情。
靜下心來寫一段代碼的時間遠比思考的過程要長,前幾天看翟鴻燊的視頻記得有一句話“思考力是在執行力前面的,只有思考沒有出現錯誤時,執行力才有價值”,在寫代碼的過程中同樣不可缺少思考力。
真分頁即頁面上一次顯示多少條資料就從資料庫中查詢多少條資料,比如顯示80-90,資料庫裡面需要查詢的也是80到90條。
我們如何從上萬條資料中查詢出某一連續幾條記錄呢?
這裡涉及到兩個變數:每頁顯示條數和當前頁數。
分頁SQL語句如下:user表
<-選擇多少條以上的資料->select rn, user_id,user_name,password,contact_Tel,email,create_date from ( <-選擇多少條以內的資料-> select rownum rn, user_id,user_name,password,contact_Tel,email,create_date from T_USER where rownum <=? order by user_id )where rn>?
查詢資料庫方法
/** * 查詢分頁資料 * @param pageNo 當前頁數 * @param pageSize 每頁大小 * @return */public PageModel<User> findUserList(int pageNo,int pageSize){//分頁用的SQL語句StringBuffer sbsql=new StringBuffer();sbsql.append("select rn,user_id,user_name,password,contact_Tel,email,create_date ");sbsql.append("from");sbsql.append("("); sbsql.append("select rownum rn, user_id,user_name,password,contact_Tel,email,create_date "); sbsql.append("from"); sbsql.append("( select user_id,user_name,password,contact_Tel,email,create_date from T_USER where user_Id <> 'root' order by user_id )"); sbsql.append("where rownum <=?"); sbsql.append(")"); sbsql.append("where rn>=?");//串連變數 Connection conn=null;//執行對象PreparedStatement pstmt=null;//結果集ResultSet rs=null;PageModel<User> pageModel=null;try{//獲得串連conn=DbUtil.getConnection();pstmt=conn.prepareStatement(sbsql.toString());//設定查詢參數值pstmt.setInt(1, pageNo * pageSize);pstmt.setInt(2, (pageNo-1) * pageSize);//執行查詢rs=pstmt.executeQuery();List<User> userlist = new ArrayList<User>();while(rs.next()){//執行個體使用者實體,並賦值 User user=new User();user.setUserId(rs.getString("user_id"));user.setUserName(rs.getString("user_name"));user.setPassword(rs.getString("password"));user.setContactTel(rs.getString("contact_tel"));user.setEmail(rs.getString("email"));user.setCreateDate(rs.getTimestamp("create_date"));userlist.add(user);}//將結果分頁pageModel=new PageModel<User>();pageModel.setList(userlist);//設定中記錄數pageModel.setTotalRecords(getTotalRecords(conn));//設定頁的大小pageModel.setPageSize(pageSize);pageModel.setPageNo(pageNo);}catch(SQLException e){e.printStackTrace();}finally{//釋放資源DbUtil.close(rs);DbUtil.close(pstmt);DbUtil.close(conn);}return pageModel;}
分頁類封裝
/** * 封裝分頁類 * @author LLS * */public class PageModel<E> {//結果集private List<E> list;//查詢記錄數private int totalRecords;//每頁多少條資料private int pageSize;//第幾頁private int pageNo;/** * 取得首頁 * @return */public int getTopPage(){return 1;}/** * 取得尾頁 * @return */public int getBottomPageNo(){return getTotalPages();}/** * 取得上一頁 * @return */public int getPreviousPageNo(){if(pageNo<=1){return 1;}else{return pageNo-1;}}/** * 取得下一頁 * @return */public int getNextPageNo(){if(pageNo>=getBottomPageNo()){return getBottomPageNo();}else{return pageNo+1;}}/** * 得到總的頁數 * @return */public int getTotalPages(){return (totalRecords+pageSize-1)/2;}public List<E> getList() {return list;}public void setList(List<E> list) {this.list = list;}public int getTotalRecords() {return totalRecords;}public void setTotalRecords(int totalRecords) {this.totalRecords = totalRecords;}public int getPageSize() {return pageSize;}public void setPageSize(int pageSize) {this.pageSize = pageSize;}public int getPageNo() {return pageNo;}public void setPageNo(int pageNo) {this.pageNo = pageNo;}}
該分頁封裝返回的是實體集列表,也可以返回一些表對象,把資料匯入到表中。
到這裡分頁的邏輯結構基本完成了,剩下的是一些前台的調用,只需要調用PageClass即可。