javaWeb09:分页

本文详细介绍了如何使用Oracle数据库进行分页查询,包括三层嵌套SQL的编写,以及结合Java Dao方法实现分页显示。内容涵盖了从基本的分页查询到带有模糊搜索的分页查询,同时提供了获取总行数的方法。示例代码展示了在新闻发布系统中,如何根据用户输入的标题进行分页检索,并在后台进行数据处理。
摘要由CSDN通过智能技术生成

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

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

最内层:查询所有记录

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

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

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

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

 

/**

* 分页第一版

* @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 = 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()){

//实例化新闻对象

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;

}

/**

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

* @param pageIndex 第几页

* @param pageSize 每页多少条记录

* @return 新闻的集合

*/

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

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

}

/**

* 获取总行数

* @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();

if(rs.next()) {

n=rs.getInt(1);

}

} catch (Exception e) {

e.printStackTrace();

}

finally {

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

type="ntitle";

}

if(cxk==null){

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

}

//接收title

request.setCharacterEncoding("utf-8");

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

if(title==null){

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() %>&#160;&#160;&#160;&#160;

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

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

</span>

</li>

<%

}

//关闭资源

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

con.close();

}

if(ps!=null){

ps.close();

}

if(rs!=null){

rs.close();

} */

%>

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

<p align="right"> 当前页数:[<%=pageIndex%>/<%=max %>]&nbsp;

<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>

效果图:

点击首页

 

点击下一页

 模糊查询  当选择了标题并且输入杭之后 由上一张图片的2/3到了现在的1/3 并且出现一条有杭的内容 且清空文本框

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值