一、了解数据库指令
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);
}