一、Oracle分页sql
--分页表select *from emp;
--分页查询
--【1】第一条查询语句带条件
-->1排序(当有条件时加上条件)
select empno,ename,sal from emp where deptno is not null order by sal desc;
-->2作为一个新的表添加了一个rd列作为分页的序号
select rownum as rd,t.*from (select empno,ename,sal from emp where deptno is not null order by sal desc) t;
-->3分页
select *from (select rownum as rd,t.*from (select empno,ename,sal from emp where deptno is not null order by sal desc) t)k where rd between 1 and 3;
==========================================
(1)select *from (select rownum as rd,t.*from (select empno,ename,sal from emp where deptno is not null order by
sal desc) t)k where rd between 1 and 3;
(2)select *from (select rownum as rd,t.*from (select empno,ename,sal from emp where deptno is not null order by
sal desc) t)k where rd>1 and rd<=3;
(3)select *from (select rownum as rd,t.*from (select empno,ename,sal from emp where deptno is not null order by
sal desc) t where rownum<=3)k where rd>1;---->(2)和(3)是等价的。与(1)不等价。
-->在Myeclipse中写分页的查询语句:
stmt =conn.createStatement();
StringBuffer sql=new StringBuffer("select * from student where 1= 1 ");
if(name != null && !"".equals(name)){
sql.append(" and name like '%"+name+"%'");
}
if(minScore>0){
sql.append(" and score >="+minScore);
}
sql.append(" order by score desc");
String sql2 = "select * from (select rownum rn,stu2.* "
+ "from ("+sql.toString()+" ) stu2 "
+ "where rownum <="+end+" ) "
+ "where rn >"+start;
rs = stmt.executeQuery(sql2);
==========================================================================================
--【2】第一条查询语句不带排序(或条件)
-->1查询
select rownum rn1,stu1.* from student stu;
-->2分页
select rownum rn2,stu2.* from (
select rownum rn1,stu1.* from student stu1)stu2
where rn1<=10 and rn1>5;
--select rownum,emp.* from emp order by sal desc ;中rownum与order by是死对头,使用了orderby之后,rownum不准确
===========================================================================================
-------------------------------------------------------------------------
--【3】分页中要用到的数据总数和带条件
select * from student;
select count(*) from student;
select * from student where 1=1 and name like '%文%' and score>=76;
注意:需要注意的是在Oracle中根据rownum来分页,而在mysql中是没有rownum的,直接用limit来分页。
二、在项目中的应用
2.1 开发流程
【1】//做法:将分页所需的所有参数都封装到pageBean实体类中<有此工具类,直接调用>,在页面上显示时只需要从
pageBean中获取属性值即可。
private int size = 5;//每页显示记录 1
private int index = 1;// 当前页号 2
private int totalPageCount = 1;// 总页数 3
private int totalCount = 0;// 记录总数 4
private int[] numbers;//展示页数集合 5
protected List<T> list;//要显示到页面的数据集 6
-->1,2直接从页面获取;3,5在pageBean中有方法计算获得;需要做的只是数据库中查询数据的条数和数据的集合。
【2】/**MVC模式
Dao层----------->sql语句,得到数据条数和数据集合
业务逻辑层------>调用Dao层方法,初始化PageBean(给pageBean赋值)
控制层---------->从页面获取数据,(name,phone,-->模糊查询的参数;index,size),创建pageBean对象,赋值index和size
属性,并调用业务层方法,最后跳转页面
视图层---------->从pageBean中获取数据并显示
*/
【3】 //步骤0:项目需求--> 步骤1:数据库表,创建数据库-->步骤2:后台查询数据,初始化pageBean-->步骤3:页面显示
步骤2>
--1.1>只需要从页面获取两个值(index(当前页数),size(每页的信息条数)--->如果要
带条件进行查询,则还需要传入条件值(例如姓名和电话-->就则还需要从页面获取
name,phone这两个参数值,));
--1.2>我们只需要从数据库中得到两个数据-->数据的条数,数据的集合
oracle数据库与Mysql数据库的查询语句不一样
--1.3>Mysql
//记录条数
select count(*) from people where name like '%张%' and phone like '%131%';
//数据集合
SELECT * from people where name like '%王%' and phone like '%1311%' limit 1,2;
//第一个参数是(起始数据的下标索引,或叫做展示数据之前需要去掉的数据)(page-1)*size
//第二个参数是每页显示的条数
--1.4Oracle
//记录条数
select count(*) from people where name like '%张%' and phone like '%131%';
//数据集合(不带条件)
select rownum rn2 ,stu2.*from(
select rownum rn1 ,stu1.*from student stu1)stu2
where rn1<=10 and rn1>5;
//带条件
select *from (select rownum as rd,t.*from
(select empno,ename,sal from emp where deptno is not null order by sal desc) t)k
where rd between 1 and 3;
============================================
(1)select *from (select rownum as rd,t.*from (select empno,ename,sal from emp where deptno is not null order by
sal desc) t)k where rd between 1 and 3;
(2)select *from (select rownum as rd,t.*from (select empno,ename,sal from emp where deptno is not null order by
sal desc) t)k where rd>1 and rd<=3;
(3)select *from (select rownum as rd,t.*from (select empno,ename,sal from emp where deptno is not null order by
sal desc) t where rownum<=3)k where rd>1;---->(2)和(3)是等价的。与(1)不等价。
-->在Myeclipse中写分页的查询语句:
stmt =conn.createStatement();
StringBuffer sql=new StringBuffer("select * from student where 1= 1 ");
if(name != null && !"".equals(name)){
sql.append(" and name like '%"+name+"%'");
}
if(minScore>0){
sql.append(" and score >="+minScore);
}
sql.append(" order by score desc");
String sql2 = "select * from (select rownum rn,stu2.* "
+ "from ("+sql.toString()+" ) stu2 "
+ "where rownum <="+end+" ) "
+ "where rn >"+start;
rs = stmt.executeQuery(sql2);
2.2 例子:
查询学生信息功能在页面分页展示
2.2.1 前台
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>查询并显示所有学生信息</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript">
function changeIndex(size){
//
var index = document.getElementById("indexn").value;
//
//location.href="/stumanager0/servlet/ShowAllServlet?index="+index+"&size="+size;
change(index,size);
}
/*
function changeSize(size){
location.href="/stumanager0/servlet/ShowAllServlet?index=1&size="+size;
}
*/
function change1(index,size){
//location.href="/stumanager0/servlet/ShowAllServlet?index="+index+"&size="+size;
//修改表单的action属性
document.forms[0].action="servlet/ShowAllServlet?index="+index+"&size="+size;
//提交表单
document.forms[0].submit();
}
function change(index,size){
//给表单index和size表单项赋值value
document.forms[0].index.value=index;
document.forms[0].size.value=size;
//提交表单
document.forms[0].submit();
}
</script>
</head>
<body>
<hr>
<form action="servlet/ShowAllServlet" method="post" id="form1">
<table align="center">
<tr>
<td>姓名</td>
<td>
<input type="text" name="name" value="${name }">
<input type="hidden" name="index" >
<input type="hidden" name="size">
</td>
<td>分数>=</td>
<td><input type="text" name="minScore" value="${minScore }"></td>
<td><input type="submit" value="提交"></td>
</tr>
</table>
</form>
<hr>
<!-- 显示所有学生 /stumanager/ -->
<table align="center" border="1" width="60%">
<tr>
<th>学生 编号</th>
<th>学生姓名</th>
<th>学生年龄</th>
<th>学生成绩</th>
<th>vs.index</th>
<th>更新操作</th>
<th>删除操作</th>
</tr>
<c:forEach items="${pageBean.list}" var="stu" varStatus="vs">
<tr>
<td>${stu.id }</td>
<td>${stu.name }</td>
<td>${stu.age }</td>
<td>${stu.score }</td>
<td>${vs.index }</td>
<td><a href="/stumanager/servlet/StudentServlet?operate=preupdate&sid=${stu.id}">更新</a></td>
<td><a href="/stumanager/servlet/StudentServlet?operate=delete&sid=${stu.id}">删除</a></td>
</tr>
</c:forEach>
<tr>
<td colspan="11" align="center">
<a href="javascript:change(1,${pageBean.size})">首页</a>
<c:if test="${pageBean.index !=1 }">
<a href="javascript:change(${pageBean.index-1 },${pageBean.size})">上一页</a>
</c:if>
<c:if test="${pageBean.index ==1 }">
上一页
</c:if>
<c:forEach items="${pageBean.numbers }" var="num">
<c:if test="${num != pageBean.index }">
<a href="javascript:change(${num },${pageBean.size})">${num }</a>
</c:if>
<c:if test="${num == pageBean.index }">
[<a href="javascript:change(${num },${pageBean.size})">${num }</a>]
</c:if>
</c:forEach>
<c:if test="${pageBean.index != pageBean.totalPageCount }">
<a href="javascript:change(${pageBean.index+1 },${pageBean.size})">下一页</a>
</c:if>
<c:if test="${pageBean.index ==pageBean.totalPageCount }">
下一页
</c:if>
<a href="javascript:change(${pageBean.totalPageCount },${pageBean.size})">末页</a>
每页
<select id="size" onchange="change(1,this.value)">
<c:forEach begin="5" end="25" step="5" var="i">
<c:if test="${i==pageBean.size }">
<option value="${i }" selected="selected"> ${i }</option>
</c:if>
<c:if test="${i!= pageBean.size }">
<option value="${i }"> ${i }</option>
</c:if>
</c:forEach>
</select>
条记录
直接跳到第<input id="indexn" size="1">页
<input type="button" value="go" onclick="changeIndex(${pageBean.size})">
共${pageBean.totalCount }条记录
</td>
</tr>
</table>
</body>
</html>
2.2.2 控制层
package cn.sxt.stmr.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.sxt.stmr.entity.Student;
import cn.sxt.stmr.service.StudentService;
import cn.sxt.stmr.service.impl.StudentServiceImpl;
import cn.sxt.stmr.util.PageBean;
public class ShowAllServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//1.1获取要查询的页号
String sindex = request.getParameter("index");//null
int index = 1;
try {
index = Integer.parseInt(sindex);// "2" "1" null "abc"
} catch (NumberFormatException e) {
e.printStackTrace();
}
//1.2获取每页记录数
String ssize = request.getParameter("size");//null
int size = 5;
try {
size = Integer.parseInt(ssize);// "2" "1" null "abc"
} catch (NumberFormatException e) {
e.printStackTrace();
}
//1.3接收查询条件之姓名
String name = request.getParameter("name");
if(name==null){
name="";
}
//1.4接收查询条件之最低分
String sminScore = request.getParameter("minScore");
if(sminScore==null){
sminScore="";
}
double minScore = 0.0;
try{
minScore = Double.parseDouble(sminScore);//null "" "abc"
}catch(NumberFormatException e){
e.printStackTrace();
}
PageBean pageBean = new PageBean<Student>();
pageBean.setIndex(index);
pageBean.setSize(size);
//2
StudentService stuService = new StudentServiceImpl();
//List <Student> stuList =stuService.findAll();
//stuService.find(pageBean);
stuService.find(pageBean,name,minScore);
//3
request.setAttribute("pageBean",pageBean);//!!!!!!!
request.setAttribute("name", name);
request.setAttribute("minScore", sminScore);
request.getRequestDispatcher("/jsp/showAll.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
2.2.3 业务层
接口
package cn.sxt.stmr.service;
import java.util.List;
import cn.sxt.stmr.entity.Student;
import cn.sxt.stmr.util.PageBean;
public interface StudentService {
/**
* 查询所有学生
* @return
*/
public List<Student> findAll();
/**
* 查询指定页的学生
* @param pageBean
*/
public void find(PageBean pageBean);
/**
* 带条件的分页查询
* @param pageBean
* @param name
* @param minScore
*/
public void find(PageBean pageBean, String name, double minScore);
}
实现类
package cn.sxt.stmr.service.impl;
import java.util.List;
import cn.sxt.stmr.dao.StudentDao;
import cn.sxt.stmr.dao.impl.StudentDaoImpl;
import cn.sxt.stmr.entity.Student;
import cn.sxt.stmr.service.StudentService;
import cn.sxt.stmr.util.PageBean;
public class StudentServiceImpl implements StudentService {
private StudentDao stuDao = new StudentDaoImpl();
public List<Student> findAll() {
return this.stuDao.findAll();
}
public void find(PageBean pageBean) {
//1.获取数据库表student记录总数
//int totalCount = this.stuDao.findAll().size();
int totalCount = this.stuDao.findCount();
//2.使用记录总数初始化PageBean(index,size,totalCount,totalPageCount,numbers都有值了,就差list了)
pageBean.setTotalCount(totalCount);
//3.调用DAO层获取指定页的学生数据并放入pageBean
/* 5
* 页号 起始记录 结束记录
* 1 1 0 5
* 2 6 5 10
* 3 11 10 15
* 4 16 15 20
* index >=(index-1)*size+1 <=index*size
* >(index-1)*size
*/
//int start = (pageBean.getIndex()-1)*pageBean.getSize();
//int end = pageBean.getIndex()*pageBean.getSize();
int start = pageBean.getStartRow();
int end = pageBean.getEndRow();
List<Student> list = this.stuDao.find(start,end);
pageBean.setList(list);
}
public void find(PageBean pageBean, String name, double minScore) {
//1.获取数据库表student中符合查询条件的记录总数
int totalCount = this.stuDao.findCount(name,minScore);
//2.使用记录总数初始化PageBean(index,size,totalCount,totalPageCount,numbers都有值了,就差list了)
pageBean.setTotalCount(totalCount);
//3.调用DAO层获取指定页的学生数据并放入pageBean
int start = pageBean.getStartRow();
int end = pageBean.getEndRow();
List<Student> list = this.stuDao.find(start,end,name,minScore);
pageBean.setList(list);
}
}
2.2.4工具类
package cn.sxt.stmr.util;
import java.util.List;
/**
* 分页的三个基本属性
* 1.每页几条记录size 可以有默认值5
* 2.当前页号 index 可以有默认值1
* 3.记录总数totalCount:不可能有默认值,需要查询数据库获取真正的记录总数
*
* 4.一共多少页 :totalPageCount=totalCount/size+1
* 5 30 31 32 33 34 35
* 5.上一页 index-1 当前页1,上一页1
* 6.下一页 index+1 当前页是最后一页 下一页:还是最后一页
*
* 扩展
* 分页Bean还可以放要查询的数据 protected List<T> list;
* 分页Bean还可以放页码列表 [1] 2 3 4 5 private int[] numbers;
*
* @author Administrator
*
* @param <T>
*/
public class PageBean<T> {
private int size = 5;//每页显示记录 //
private int index = 1;// 当前页号
private int totalPageCount = 1;// 总页数 ok
private int totalCount = 0;// 记录总数 ok
private int[] numbers;//展示页数集合 //ok
protected List<T> list;//要显示到页面的数据集
/**
* 得到开始记录
* @return
*/
public int getStartRow() {
return (index - 1) * size;
}
/**
* 得到结束记录
* @return
*/
public int getEndRow() {
return index * size;
}
/**
* @return Returns the size.
*/
public int getSize() {
return size;
}
/**
* @param size
* The size to set.
*/
public void setSize(int size) {
if (size > 0) {
this.size = size;
}
}
/**
* @return Returns the currentPageNo.
*/
public int getIndex() {
if (totalPageCount == 0) {
return 0;
}
return index;
}
/**
* @param currentPageNo
* The currentPageNo to set.
*/
public void setIndex(int index) {
if (index > 0) {
this.index = index;
}
}
/**
* @return Returns the totalCount.
*/
public int getTotalCount() {
return totalCount;
}
/**
* @param totalCount
* The totalCount to set.
*/
public void setTotalCount(int totalCount) {
if (totalCount >= 0) {
this.totalCount = totalCount;
setTotalPageCountByRs();//根据总记录数计算总页�?
}
}
public int getTotalPageCount() {
return this.totalPageCount;
}
/**
* 根据总记录数计算总页�?
* 5
* 20 4
* 23 5
*/
private void setTotalPageCountByRs() {
if (this.size > 0 && this.totalCount > 0 && this.totalCount % this.size == 0) {
this.totalPageCount = this.totalCount / this.size;
} else if (this.size > 0 && this.totalCount > 0 && this.totalCount % this.size > 0) {
this.totalPageCount = (this.totalCount / this.size) + 1;
} else {
this.totalPageCount = 0;
}
setNumbers(totalPageCount);//获取展示页数集合
}
public int[] getNumbers() {
return numbers;
}
/**
* 设置显示页数集合
*
* 默认显示10个页码
* 41 42 43 44 [45 ] 46 47 48 49 50
*
*
* 1 2 3 [4] 5 6 7 8 9 10
*
* 41 42 43 44 45 46 47 [48] 49 50
* @param totalPageCount
*/
public void setNumbers(int totalPageCount) {
if(totalPageCount>0){
//!.当前数组的长度
int[] numbers = new int[totalPageCount>10?10:totalPageCount];//页面要显示的页数集合
int k =0;
//
//1.数组长度<10 1 2 3 4 .... 7
//2.数组长度>=10
// 当前页<=6 1 2 3 4 10
// 当前页>=总页数-5 ......12 13 14 15
// 其他 5 6 7 8 9 当前页(10) 10 11 12 13
for(int i = 0;i < totalPageCount;i++){
//保证当前页为集合的中�?
if((i>=index- (numbers.length/2+1) || i >= totalPageCount-numbers.length) && k<numbers.length){
numbers[k] = i+1;
k++;
}else if(k>=numbers.length){
break;
}
}
this.numbers = numbers;
}
}
public void setNumbers(int[] numbers) {
this.numbers = numbers;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
/*
public static int getTotalPageCount(int iTotalRecordCount, int iPageSize) {
if (iPageSize == 0) {
return 0;
} else {
return (iTotalRecordCount % iPageSize) == 0 ? (iTotalRecordCount / iPageSize) : (iTotalRecordCount / iPageSize) + 1;
}
}*/
}
来源:https://www.cnblogs.com/vole/p/12517532.html