实现分页的思路:
(1)为什么要用分页?
当我们数据较多时,页面显示不完全,需要用户拖动页面才能浏览更多信息,有点麻烦,这是我们会采取的分页。采取分页后,数据能够按照指定格式显示,布局清晰,且不受信息数量的限制
(2)分页显示的步骤
a、确定每页显示的数据数量
b、计算显示的页数
c、编写SQL语句
(3)确定分页页数
a、获取总记录数
b、根据每页显示的记录数与总记录数
c、关键代码
package com.zking.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.zking.entity.News;
import com.zking.util.DBHelper;
/**
* 分页方法
* @author Janet
*
* @date 2022年4月4日 上午10:06:03
*/
public class NewsDao {
//三兄弟
private Connection con=null;
private PreparedStatement ps=null;
private ResultSet rs=null;
/**
* 分页第一版
* @param pageIndex 第几页
* @param pageSize 多少条数据
* @return 新闻集合
*/
public List<News> getAll(int pageIndex,int pageSize){
List<News> ls=new ArrayList<News>();
int a=(pageIndex-1)*pageSize;
int b=pageIndex*pageSize;
try {
//创建连接
con=DBHelper.getCon();
//定义sql语句
String sql="select * from(\r\n" +
" select a.nid,a.ntitle,a.nauthor,rownum as rid from news280 a\r\n" +
") b where b.rid between ? and ?";
//获得执行对象
ps=con.prepareStatement(sql);
//给占位符
ps.setInt(1, a);
ps.setInt(2, b);
//获得结果集
rs=ps.executeQuery();
//循环遍历
while(rs.next()){
//实例化新闻对象
News n=new News();
//给对象赋值
n.setNid(rs.getInt(1));
n.setNtitle(rs.getString(2));
n.setNauthor(rs.getString(3));
//加到集合中
ls.add(n);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBHelper.myClose(con, ps, rs);
}
return ls;
}
/**
* 分页第二版
* @param pageIndex 第几页
* @param pageSize 多少条记录
* @return 新闻集合
*/
public List<News> getpage(int pageIndex,int pageSize){
List<News> ls=new ArrayList<News>();
int a=(pageIndex-1)*pageSize;
int b=pageIndex*pageSize;
try {
//创建连接
con=DBHelper.getCon();
//定义sql语句
String sql="select * from (\r\n" +
"select a.*,rownum as rid from(\r\n" +
" select nid,ntitle,nauthor from news280 order by nid desc\r\n" +
") a\r\n" +
") b where b.rid between ? and ?";
//获得执行对象
ps=con.prepareStatement(sql);
//给占位符
ps.setInt(1, a);
ps.setInt(2, b);
//获得结果集
rs=ps.executeQuery();
//循环遍历
while(rs.next()){
//实例化新闻对象
News n=new News();
//给对象赋值
n.setNid(rs.getInt(1));
n.setNtitle(rs.getString(2));
n.setNauthor(rs.getString(3));
//加到集合中
ls.add(n);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBHelper.myClose(con, ps, rs);
}
return ls;
}
/**
* 带模糊查询的分页
* @param pageIndex 第几页
* @param pageSize 每页多少条记录
* @param title 关键字
* @return 新闻的记录
*/
public List<News> getpage(int pageIndex,int pageSize,String title){
List<News> ls=new ArrayList<News>();
int a=(pageIndex-1)*pageSize;
int b=pageIndex*pageSize;
try {
//创建连接
con=DBHelper.getCon();
//定义sql语句
String sql="select * from (\r\n" +
"select a.*,rownum as rid from(\r\n" +
" select nid,ntitle,nauthor from news280 where ntitle like '%"+title+"%' order by nid desc\r\n" +
") a\r\n" +
") b where b.rid between ? and ?";
//获得执行对象
ps=con.prepareStatement(sql);
//给占位符
ps.setInt(1, a);
ps.setInt(2, b);
//获得结果集
rs=ps.executeQuery();
//循环遍历
while(rs.next()){
//实例化新闻对象
News n=new News();
//给对象赋值
n.setNid(rs.getInt(1));
n.setNtitle(rs.getString(2));
n.setNauthor(rs.getString(3));
//加到集合中
ls.add(n);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBHelper.myClose(con, ps, rs);
}
return ls;
}
/**
* 获取总行数
* @param str 表名等
* @return 行数
*/
public int getRows(String str) {
int n=0;
try {
con=DBHelper.getCon();
String sql="select count(*) from "+str;
ps=con.prepareStatement(sql);
rs=ps.executeQuery();
while(rs.next()) {
n=rs.getInt(1);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.myClose(con, ps, rs);
}
return n;
}
}
(4)分页SQL语句
a、伪列-rownum
1、由Oracle数据库表对象自动创建
2、表示每一行记录的行号
b、使用三层嵌套方式编写SQL
1.最内层:查询所有记录
2.中间层:通过rownum的限定擦护心数量的上限
3.最外层:通过rownum的限定查询数量的下限
c、关键代码(要求按照时间求6-10条数据)
String sql="select * from (\r\n" +
"select a.*,rownum as rid from(\r\n" +
" select nid,ntitle,nauthor from news280 order by nid desc\r\n" +
") a\r\n" +
") b where b.rid between 6 and 10
(5)当前页的确认
a、获取当前页
1.获取显示的页码
2.如果获取的页码为null,则设置当前页为首页
3.如果获取的页码不为null,则该页码即为当前页页码
b、关键代码
NewsDao nd=new NewsDao();
int pageIndex=1;//当前页
int pageSize=5;
//接收pid
String pid=request.getParameter("pid");
if(pid!=null){//说明点击了上一页或者下一页等
pageIndex=Integer.parseInt(pid);//改变pageIndex的值
}
//计算最大页码
int rows=nd.getRows("news280 where ntitle like '%"+title+"%'");
(6)分页的设置
a、分页设置的实现
1.根据已确认的当前页,设置上页和下页
2.根据总页数设置首页和末页
(7)首页和末页的控制
a、已经设置了首页和末页,为什么还要进行控制?
假设当前页为首页,当用户点击上页连接是,传递的pageindex参数为当前页减1,此时入部进行控制将会导致错误的查询
b、关键代码:
//接收pid
String pid=request.getParameter("pid");
if(pid!=null){//说明点击了上一页或者下一页等
pageIndex=Integer.parseInt(pid);//改变pageIndex的值
}
//计算最大页码
int rows=nd.getRows("news280 where ntitle like '%"+title+"%'");
//对首页与末页进行控制 使用三元运算符
<p align="right">
当前页数:[<%=pageIndex %>/<%=max %>]
<a href="admin.jsp?pid=1&title=<%=title %>">首页</a>
<a href="admin.jsp?pid=<%=pageIndex>1?pageIndex-1:1%>&title=<%=title %>">上一页</a>
<a href="admin.jsp?pid=<%=pageIndex>max?pageIndex+1:max%>&title=<%=title %>">下一页</a>
<a href="admin.jsp?pid=<%=max%>">末页</a> </p>
以上就是分页的思路