一、数据库分页:
1、要实现分页要用到伪列 rownum
2、伪列不能作用于大于符号 也不能作用于between...and
3、因此,将伪列-->明列(实列) 实际上就是取个别名
万能公式:
(pageIndex-1)*pageSize+1------pageIndex*pageSize
--先编号,后排序
select * from (
select a.nid,a.nbt,a.nzz,rownum as rid from tb_xw a where nbt like '%王%' order by nid desc
) b where b.rid between 1 and 5
--理应先排序 后编号
select * from(
select a.*,rownum as rid from (
select nid,nbt,ntp from tb_xw where nbt like '%%' order by nid desc
) a
) b where b.rid between 6 and 10
二、javaWeb的分页:
分页显示的步骤: 确定每页显示的数据数量, 计算显示的页数, 编写SQL语句.
dao方法:
/**
* 分页第一版
* @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=DBHelper.getCon();//创建连接
String sql="select * from (\r\n" +
"select a.nid,a.nbt,a.nzz,rownum as rid from tb_xw 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();
//給对象赋值
n.setNid(rs.getInt(1));
n.setNbt(rs.getString(2));
n.setNzz(rs.getString(3));
//加到集合中 勿忘
ls.add(n);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.myClose(con, ps, rs);
}
return ls;
}
/**
* 分页第二版
* @param pageIndex 第几页
* @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();//创建连接
String sql="select * from(\r\n" +
"select a.*,rownum as rid from (\r\n" +
"select nid,nbt,ntp from tb_xw 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();
//給对象赋值
n.setNid(rs.getInt(1));
n.setNbt(rs.getString(2));
n.setNzz(rs.getString(3));
//加到集合中 勿忘
ls.add(n);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.myClose(con, ps, rs);
}
return ls;
}
/**
* 带模糊查询的分页
* @param pageIndex 第几页
* @param pageSize 每页多少条记录
* @param xl 选择的标题
* @param te 关键字
* @return 新闻的集合
*/
public List<News> getAll(int pageIndex,int pageSize,String xl,String te){
List<News> ls=new ArrayList<News>();
//公式 找规律
int a=(pageIndex-1)*pageSize+1;
int b=pageIndex*pageSize;
try {
con=DBHelper.getCon();//创建连接
String sql="";
if(xl!=null) {
sql+="select * from(\r\n" +
"select a.*,rownum as rid from (\r\n" +
"select nid,tid,nbt,nzz from tb_xw where "+xl+" like '%"+te+"%' order by nid desc\r\n" +
") a\r\n" +
") b where b.rid between ? and ?";//定义sql语句
}else {
sql+="select * from(\r\n" +
"select a.*,rownum as rid from (\r\n" +
"select nid,tid,nbt,nzz from tb_xw 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();
//給对象赋值
n.setNid(rs.getInt(1));
n.setNbt(rs.getString(2));
n.setNzz(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();
if(rs.next()) {
n=rs.getInt(1);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBHelper.myClose(con, ps, rs);
}
return n;
}
界面的:
<%
request.setCharacterEncoding("utf-8");//这转译不了就用下面的破碎重组
//取模糊查询的关键字
String title=request.getParameter("title");
if(title==null){
title="";//相当于查询全部
}
String xl=request.getParameter("xx");
//破碎重组 用title.getBytes()拿到的字节数组, 用它以前的编码方式: iso-8859-1 将title破碎成字节数组,再用utf-8重组成字符串
//title=new String(title.getBytes("iso-8859-1"),"utf-8");
//jdbc连接Oracle 查询新闻的信息:新闻编号 标题 作者
//地址栏传参: ?键=值&键=值
//调用方法
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("tb_xw where "+xl+" like '%"+title+"%'");//15
int max=rows/pageSize;//15/5=3
if(rows%pageSize!=0){//除不尽=有余数
max++;//多加一页
}
/*
分析:
1、拿到总行数 15
2、计算页码 15/5=3
3、特殊清空 15/5=3 +1--> 除不尽就+1
*/
List<News> ls= nd.getAll(pageIndex, pageSize, xl, title);
//循环遍历
for(News n:ls){
%>
<li><a href="/q4/news/read.jsp?nid=<%=n.getNid()%>"><%=n.getNbt() %></a> <span> 作者: <%=n.getNzz() %>     
<a href='/q4/news/update.jsp?nid=<%=n.getNid()%>'>修改</a>     
<a href='/q4/news/dodelete.jsp?nid=<%=n.getNid() %>' onclick='return clickdel()'>删除</a> </span>
</li>
<%
}
%>
<p align="right"> 当前页数:[<%=pageIndex %>/<%=max %>]
<a href="admin.jsp?pid=1&xx=<%=xl %>&title=<%=title %>">首页</a>
<a href="admin.jsp?pid=<%=pageIndex>1?pageIndex-1:1%>&xx=<%=xl %>&title=<%=title %>">上一页</a>
<a href="admin.jsp?pid=<%=pageIndex<max?pageIndex+1:max %>&xx=<%=xl %>&title=<%=title %>">下一页</a>
<a href="admin.jsp?pid=<%=max %>&xx=<%=xl %>&title=<%=title %>">末页</a> </p>
</ul>