伪列-rownum
由 Oracle 数据库表对象自动创建
表示每一行记录的行号
使用三层嵌套方式编写SQL
最内层:查询所有记录
中间层:通过 rownum 的限定查询数量的上限
最外层:通过 rownum 的限定查询数量的下限
分页方法代码如下(在dao方法里):
公式:(pageIndex-1)*pageSize+1---pageIdex*pageSize
/**
* 分页的第一版
* @param pageIndex 第几页
* @return 新闻的集合
*/
public List<News>getAll(int pageIndex){
List<News> ls=new ArrayList<News>();
int pageSize=5;
int a=(pageIndex-1)*pageSize+1;
int b=pageIndex*pageSize;
try {
con=DBHper.getcon();//创建连接
String sql="select * from(\r\n" +
"select a.nid,a.ntitle,a.nauthor,rownum as rid from news279 a order by nid desc\r\n" +
") b where b.rid between ? and ?";//定义sql语句
ps=con.prepareStatement(sql);//获得执行对象
//给占位符赋值
ps.setInt(1, a);
ps.setInt(2,b);
rs=ps.executeQuery();//获得结果集
//遍历结果集
while(rs.next()) {
//实例化一个新闻对象
News n=new News();
//给对象赋值 set
n.setNid(rs.getInt(1));
n.setNtitle(rs.getString(2));
n.setNauthor(rs.getString(3));
//加到集合中 ***
ls.add(n);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBHper.myClose(con, ps, rs);
}
return ls;
}
/**
* 分页的第二版
* @param pageIndex 第几页=当前页码
* @param pageSize 每页多少条记录
* @return 新闻的集合
*/
public List<News>getAll(int pageIndex,int pageSize){
List<News> ls=new ArrayList<News>();
//公式 找规律
int a=(pageIndex-1)*pageSize+1;
int b=pageIndex*pageSize;
try {
con=DBHper.getcon();//创建连接
String sql="select * from (\r\n" +
"select a.*,rownum as rid from(\r\n" +
"select nid,ntitle,nauthor from news279 order by nid desc\r\n" +
")a\r\n" +
")b where b.rid between ? and ?";//定义sql语句
ps=con.prepareStatement(sql);//获得执行对象
//给占位符赋值
ps.setInt(1, a);
ps.setInt(2,b);
rs=ps.executeQuery();//获得结果集
//遍历结果集
while(rs.next()) {
//实例化一个新闻对象
News n=new News();
//给对象赋值 set
n.setNid(rs.getInt(1));
n.setNtitle(rs.getString(2));
n.setNauthor(rs.getString(3));
//加到集合中 ***
ls.add(n);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBHper.myClose(con, ps, rs);
}
return ls;
}
/**
* 获取总行数
* @param str 表名
* @return 行数
*/
public int getRows(String str) {
int n=0;
try {
con=DBHper.getcon();
String sql="select count(*) from "+str;
ps=con.prepareStatement(sql);
rs=ps.executeQuery();
if(rs.next()) {
n=rs.getInt(1);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHper.myClose(con, ps, rs);
}
return n;
}
/**
* 带模糊查询的分页(根据标题)
* @param pageIndex 第几页
* @param pageSize 每页多少条数据
* @param title 标题的关键字
* @return 新闻的集合
*/
public List<News>getAll(int pageIndex,int pageSize,String title){
List<News> ls=new ArrayList<News>();
//公式 找规律
int a=(pageIndex-1)*pageSize+1;
int b=pageIndex*pageSize;
try {
con=DBHper.getcon();//创建连接
String sql="select * from (\r\n" +
"select a.*,rownum as rid from(\r\n" +
"select nid,ntitle,nauthor from news279 where ntitle like '%"+title+"%' order by nid desc\r\n" +
")a\r\n" +
")b where b.rid between ? and ?";//定义sql语句
ps=con.prepareStatement(sql);//获得执行对象
//给占位符赋值
ps.setInt(1, a);
ps.setInt(2,b);
rs=ps.executeQuery();//获得结果集
//遍历结果集
while(rs.next()) {
//实例化一个新闻对象
News n=new News();
//给对象赋值 set
n.setNid(rs.getInt(1));
n.setNtitle(rs.getString(2));
n.setNauthor(rs.getString(3));
//加到集合中 ***
ls.add(n);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBHper.myClose(con, ps, rs);
}
return ls;
}
然后我们在其他页面调用dao方法:
//调用方法
NewsDao nd=new NewsDao();
int pageIndex=1;//页码
int pageSize=5;//每页多少记录
//接收pid
String pid=request.getParameter("pid");
if(pid!=null){//说明点击了"首页"、上一页、下一页或者尾页
pageIndex=Integer.parseInt(pid);//改变页码
}
//计算最大页码
//拿到总行数
int rows=nd.getRows("news279 where ntitle like '%"+title+"%'");
int max=rows/pageSize;
if(rows%pageSize!=0){//除不进=有余数
max++;
}
/*
分析:
1.拿到总行数
2.计算页码
3特殊情况 除不进就加1
*/
List<News>ls=nd.getAll(pageIndex, pageSize, title);
分页设置的实现
根据已确认的当前页,设置上页和下页
根据总页数设置首页和末页(这里是运用到了三元运算符)
当前页数:[<%=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%>&title=<%=title%>">末页</a> </p>