一、瞭解數據庫指令
Oracle數據庫相對於MySQL數據庫來說,要實現分頁查看,Oracle中沒有像MySQL裏的limit命令,使用的Oracle語句也比較複雜
select * from (select rownum r,e. * from 要分頁的表 e where rownum<=m*n) t where r>m*n-m ;
注:要分頁的表 後面的e:是給表取的別名
rownum r爲行的別名
例如:
select * from (select t2.*,rownum rn from (select t1.* from tb1_user t1 ) t2) where rn>=1 and rn<=4
利用這樣類似的數據庫操作命令,我們來實現分頁(分頁最主要的幾個元素是,頁面的大小和當前的頁碼
頁面大小:我們可以根據前端顯示效果自定義大小
當前頁碼:這個元素我們不能像MySQL指令一樣,mysql指定行索引和頁面的大小,就可以查詢你從你指定行開始,查詢到指定大小的數據。
如圖所示:
而Oracle運用上述語句執行結果如圖所示,根據下面圖可以看出,(第一個參數rn也是行索引,後面的參數約束也是行索引,查詢到的數據條數就和MySQL就有出路 。)
①Oracle:根據簡單的換算,看下面的表達式換算可以得出你你想要的的分頁查詢
select * from (select t2.*,rownum rn from (select t1.* from tb1_user t1 order by id) t2) where rn>? and rn<=?
第一個參數:頁碼= (pageNumber-1)*pageSize
第二個參數:頁的大小=pageSize*pageNumber(有最後索引減前一個索引獲得頁面的大小)
②MySql:根據簡單的計算看下面的表達式換算可以得出你你想要的的分頁查詢
String sql = "select id,stuId,stuName,score from stu limit ?,?";
第一個參數:頁碼=pageNumber-1)*pageSize
第二個參數:頁的大小=pageSize(直接指定大小)
二、從數據庫獲取數據(dao層方法)
public ArrayList<User> turnPageD(int pageNumber, int pageSize) {
ArrayList<User> list = new ArrayList<>();
User u = null;
Connection conn = null;
ResultSet resultSet = null;
PreparedStatement statement = null;
try {
conn = DbUtil.getConnection();//鏈接數據庫
/*oracle 不支持分頁limit命令*/
String sql = "select * from (select t2.*,rownum rn from (select t1.* from tb1_user t1 order by id) t2) where rn>? and rn<=?";
statement = conn.prepareStatement(sql);
statement.setInt(1,(pageNumber-1)*pageSize);
statement.setInt(2, pageSize*pageNumber);
resultSet = statement.executeQuery();
if (resultSet != null) {
while (resultSet.next()) {
u = new User();
u.setId(resultSet.getInt(1));
u.setUserCode(resultSet.getString(2));
u.setUserName(resultSet.getString(3));
u.setUserPassword(resultSet.getString(4));
u.setGender(resultSet.getInt(5));
u.setBirthday(resultSet.getDate("birthday"));
u.setPhone(resultSet.getString(7));
u.setAddress(resultSet.getString(8));
u.setCreateBy(resultSet.getInt(9));
u.setCreationDate(resultSet.getDate("creationDate"));
u.setModifyBy(resultSet.getInt(11));
u.setModifyDate(resultSet.getDate("modifyDate"));
u.setUserRole(resultSet.getInt("userRole"));
list.add(u);
}
System.out.println("添加數據成功!!");
}
} catch (SQLException e) {
System.out.println("查看數據失敗!!");
e.printStackTrace();
} finally {
try {
statement.close();
conn.close();
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}
三、將獲取的數據渲染到界面(控制層)
jsp頁碼控制
顯示效果爲:共xx碼 首頁 上一頁 下一頁 尾頁
利用EL表達式來處理:
首頁:1
上一頁爲 :${requestScope.curPage<=1?1:requestScope.curPage-1}
利用三目運算符 如果點擊上一頁面時,頁碼數小於等於1,就跳轉到首頁,否知頁碼數減一: 下一頁也如此。
<ul class="page-num-ul clearfix">
<li>共${requestScope.recordCount}條記錄 ${requestScope.curPage}/${requestScope.param} 頁</li>
<a href="user?method=select&page=${1}">首頁</a>
<a href="user?method=select&page=${requestScope.curPage<=1?1:requestScope.curPage-1}">上一頁</a>
<a href="user?method=select&page=${requestScope.curPage>=requestScope.param?requestScope.param:requestScope.curPage+1}">下一頁</a>
<a href="user?method=select&page=${requestScope.param}">最後一頁</a>
</ul>
控制層是直接關聯的jsp頁面顯示的,分頁時,我們需要自定義頁面的大小,真正關心的是頁碼。
對於分頁顯示而言,首先點擊查看數據是我們就已經分好頁。對於這個操作,我們點擊時就從前臺發送了一個servlet請求,請求獲取頁面的的數據,而我們的頁碼是根據前端頁面,點擊上一頁、下一頁獲取而來的。這就會導致一個問題,第一次獲取來的頁碼參數爲空(req.getParameter("page")==null),因此要做空的判斷,然後自定義頁面數據( list = userService.turnPageS(1,8);),而從第二次請求而言:page值就不爲空了。這樣分頁顯示就完成了。
if(method.equals("select")){
List<User> list = userService.selectAllUserS();
int recordCount = list.size();/*獲取記錄條數*/
req.setAttribute("param",recordCount/8+1);/*記錄頁數爲:記錄總數/頁面顯示記數
*+1將記錄條數發送給頁面*/
req.setAttribute("recordCount",recordCount);
int page = 1;
if(req.getParameter("page")==null){ //首次訪問時不能獲取頁碼
list = userService.turnPageS(1,8); //首次訪問將page值置爲1 默認顯示首頁
}else{
page = Integer.parseInt(req.getParameter("page"));//獲取接下來的當前頁碼
list = userService.turnPageS(page,8);
}
req.setAttribute("listUser",list);
req.setAttribute("curPage",page);//首次訪問時將頁碼1傳送給前端頁面
System.out.println("curpage:"+page);
req.getRequestDispatcher("admin/userlist.jsp").forward(req, resp);
}