由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() %>    
<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()){
con.close();
}
if(ps!=null){
ps.close();
}
if(rs!=null){
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>
效果图:
点击首页
点击下一页
模糊查询 当选择了标题并且输入杭之后 由上一张图片的2/3到了现在的1/3 并且出现一条有杭的内容 且清空文本框