javaWeb09:分页

由Oracle数据库表对象自动创建

表示每一行记录的行号 使用三层嵌套方式编写SQL

最内层:查询所有记录

中间层:通过rownum[伪列]的限定查询数量的上限

最外层:通过rownum的限定查询数量的下限

我们以新闻发布系统的主界面为例

dao方法:在上一篇文章中 我们已经提到了JavaBean,即现在分页所需的dao方法也写在和上一篇一样的位置

/**

* 分页第一版

* @param pageIndex 第几页

* @param pageSize 每页多少条记录

* @return 新闻集合

*/

public List<News> getAll(int pageIndex,int pageSize){undefined

List<News> ls = new ArrayList<News>();

//找规律

int a = (pageIndex-1)*pageSize+1;

int b = pageIndex*pageSize;

try {undefined

//创建连接

con = DBHelper.getCon();

//定义sql语句

String sql = " select * from(\r\n" +

" select a.nid,a.ntitle,a.nauthor,rownum as rid from news280 order by nid desc\r\n" +

") b where b.rid between ? and ?";

//out.print(sql);

//获得执行对象

ps = con.prepareStatement(sql);

//给占位符赋值

ps.setInt(1, a);

ps.setInt(2, b);

//获得结果集

rs = ps.executeQuery();

//循坏遍历

while(rs.next()){undefined

//实例化新闻对象

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) {undefined

e.printStackTrace();

}finally {undefined

DBHelper.myClo(con, ps, rs);

}

return ls;

}

/**

* 分页第二版 先排序后编号

* @param pageIndex 第几页

* @param pageSize 每页多少条记录

* @return 新闻的集合

*/

public List<News> getPage(int pageIndex,int pageSize){undefined

List<News> ls = new ArrayList<News>();

//找规律

int a = (pageIndex-1)*pageSize+1;

int b = pageIndex*pageSize;

try {undefined

//创建连接

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 ?";

//out.print(sql);

//获得执行对象

ps = con.prepareStatement(sql);

//给占位符赋值

ps.setInt(1, a);

ps.setInt(2, b);

//获得结果集

rs = ps.executeQuery();

//循坏遍历

while(rs.next()){undefined

//实例化新闻对象

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) {undefined

e.printStackTrace();

}finally {undefined

DBHelper.myClo(con, ps, rs);

}

return ls;

}

/**

* 获取总行数

* @param str 表名等

* @return 行数

*/

public int getRows(String str) {undefined

int n = 0;

try {undefined

con=DBHelper.getCon();

String sql = "select count(*) from "+str;

ps=con.prepareStatement(sql);

rs=ps.executeQuery();

if(rs.next()) {undefined

n=rs.getInt(1);

}

} catch (Exception e) {undefined

e.printStackTrace();

}

finally {undefined

DBHelper.myClo(con, ps, rs);

}

return n;

}

/**

* 带模糊查询的分页(根据标题)

* @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+1;

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 ?";

//out.print(sql);

//获得执行对象

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.myClo(con, ps, rs);

}

return ls;

}

}

最终我们在admin界面调用的是有背景颜色的dao方法

admin:

<form action="/web05/news/admin.jsp" method="post">

<!-- <select name="type">

<option value='nauthor'>作者</option>

<option value='ntitle'>标题</option>

</selecte>

<input type="text" name='cxk' /> -->

标题:<input type="text" name="title"/>

<input type="submit" value="查询新闻" />

</form>

//接收下拉框的值

String type = request.getParameter("type");

//out.print(type);

//接收文本框的值

String cxk = request.getParameter("cxk");

//判断

if(type==null){undefined

type="ntitle";

}

if(cxk==null){undefined

cxk="";//相当于查询全部

}

//接收title

request.setCharacterEncoding("utf-8");

String title = request.getParameter("title");

if(title==null){undefined

title="";//相当于查询全部

}

//破碎重组

//title = new String(title.getBytes("iso-8859-1"),("utf-8"));

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+"%'");

int max = rows/pageSize;

if(rows%pageSize!=0){//如果除不尽 有余数

max++;//+1

}

//调用查询的方法

//List<News> ls = nd.getAll();

List<News> ls = nd.getPage(pageIndex, pageSize, title);

//循环遍历

for(News n :ls){//n:新闻对象

%>

<li> <a href="/web05/news/read.jsp?nid=<%=n.getNid()%>"><%=n.getNtitle() %> </a>

<span> 作者: <%=n.getNauthor() %>    

<a href='/web05/news/update.jsp?nid=<%=n.getNid()%>'>修改</a>     

<a href='/web05/news/dodelete.jsp?nid=<%=n.getNid() %>' οnclick='return clickdel()'>删除</a>

</span>

</li>

<%

}

//关闭资源

/* if(con!=null&&!con.isClosed()){undefined

con.close();

}

if(ps!=null){undefined

ps.close();

}

if(rs!=null){undefined

rs.close();

} */

%>

<li class='space'></li>

<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 %>&title=<%=title%>">末页</a>

</p>

</ul>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值