分頁查詢,sql分頁查詢
分頁查詢其實和其他的沒什麼區別,主要區別在一個地方,就是查詢語句不通,分頁查詢可能比較麻煩一點,下面來說一下該如何?我們的分頁查詢功能:
一、代碼展示 1、封裝分頁實體PageModel,儲存一些分頁查詢的基本資料
/** * 封裝分頁資訊 */</span> public class PageModel { //結果集</span> private List list; //查詢記錄數</span> private int totalRecords; //每頁多少條資料</span> private int pageSize; //第幾頁</span> private int pageNo; //總頁數</span> public int getTotalPages(){ return (totalRecords+pageSize-1)/pageSize; } //取得首頁</span> public int getTopPageNo(){ return 1; } //取得尾頁</span> public int getButtomPageNo(){ return getTotalPages(); } //上一頁</span> public int getPreviousPageNo(){ if (pageNo<=1){ return 1; } return pageNo-1; } //下一頁</span> public int getNextPageNo(){ if (pageNo>= getTotalPages()){ return getTotalPages(); } return pageNo+1; } public List getList() { return list; } public void setList(List 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; } } </span>
2、編寫分頁查詢方法
/** * 分頁查詢 * @param pageNo 第幾頁 * @param pageSize 每頁多少條資料 * @return pageMode */ public PageModel findUserList(int pageNo,int pageSize){ //利用StringBuffer存放分頁查詢語句 StringBuffer sbSql=new StringBuffer(); sbSql.append("select user_id,user_name,password,contract_tel,email,create_date ") .append("from ") .append("( ") .append("select ROWNUM rn,user_id,user_name,password,contract_tel,email,create_date ") .append("from") .append("( ") .append("select * from T_USER where USER_ID<>'root' ORDER BY USER_ID ") .append(") where ROWNUM <= ? ") .append(") where rn > ? "); //建立Connection對象和PreparedStatement對象 Connection conn=null; PreparedStatement pstmt=null; //建立ResultSet存放查詢結果 ResultSet rs=null; PageModel 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 userList=new ArrayList(); //處理查詢結果 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("CONTRACT_TEL")); user.setEmail(rs.getString("EMAIL")); user.setCreateDate(rs.getTimestamp("CREATE_DATE")); userList.add(user); } pageModel=new PageModel(); 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); } //返回分頁查詢結果pageModel return pageModel; } public int getTotalRecords(Connection conn) throws SQLException { String sql="select count(*) from t_user where user_id <> 'root'"; PreparedStatement pstmt=null; ResultSet rs=null; int count=0; try{ pstmt=conn.prepareStatement(sql); rs=pstmt.executeQuery(); rs.next(); count=rs.getInt(1); }finally{ DbUtil.close(rs); DbUtil.close(pstmt); } return count; }
二、功能分析 綜合上面的東西,其實分頁查詢本質上就是一個查詢語句的事:
《第三部分表3--開始》 select user_id,user_name,password,contract_tel,email,create_date from
( 《第二部分表2--開始》select ROWNUM rn,user_id,user_name,password,contract_tel,email,create_date from( 《第一部分表1---開始》
select * from T_USER where USER_ID<>'root' ORDER BY USER_ID 《第一部分表1---結束》)where ROWNUM <=
(pageNo * pageSize) 《第二部分表2--結束》) where rn >
(pageNo-1)*pageSize《第三部分表3--結束》
三、總結:由上面可知,分頁查詢其實就是表的巢狀查詢,第一步:先將要查詢的內容查出來,如第一部分;第二步:在去掉大於最大記錄的那部分記錄,如第二部分;第三步:在將小於最小記錄的那部分去掉,如第三部分。掐頭去尾,剩下的正好是我們所需要的分頁查詢資料。