首先,判断的标准是速度,显而易见,数据库服务器,Web应用服务器和客户端之间是网络,如果网络传递的数据量越少,则客户端获得响应的速度越快。一般来说,数据库服务器和Web应用服务器的处理能力一般比客户端要强很多.从这两点来看,在客户端分页的方案是最不可取的。
其次,在Web服务器端分页和在数据库端分页,如果选择在Web服务器端分页的话,大部分的被过滤掉的数据还是被传输到了Web应用服务器端,与其这样还不如直接在数据库端进行分页。
因此比较好的分页做法应该是每次翻页的时候只从数据库里检索页面大小的块区的数据。
虽然每次翻页都需要查询数据库,但查询出的记录数很少,网络传输数据量不大,如果使用连接池更可以略过最耗时的建立数据库连接过程。而在数据库端有各种成熟的优化技术用于提高查询速度,比在应用服务器层做缓存有效得多。
Web服务器端分页和在数据库端分页:
数据库端分页:通过JDBC的方式访问数据库,根据数据库类型采取不同的SQL分页语句。
对于MySql数据库:采用limit m,n语句进行分页,需要指定m和n的2个值
Limit后的两个参数中,参数m是起始下标[页码],它从0开始;参数n是返回的记录数。
SQL语句形式:
语句1: select * from 表名 limit m,n; --返回表中m-n行的数据
语句2: select * from 表名 limit m offset n; --从n行开始到返回表中m行的数据
假设 numberpage 表示每页要显示的条数,pagenumber表示页码:
语句3:select * from 表名 limit (pagenumber-1)*numberpage,numberpage;
语句4:select * from 表名 limit numberpage offset(pagenumber-1)*numberpage;
对于Oracle数据库:采用rownum的方式进行分页,rownum表示一条记录的行号,注意Oracle获取每一行后才赋予.因此,指定rownum区间来取得分页数据在一层查询语句中是无法做到的,要分页还要进行一次查询。
SQL形式:
select * from (
select page.*,rownum rn
from (select * from 表名) page
where rownum <= (?-1)*?+?)
where rn > (?-1)*?;
--其中page是将表中的数据查询出来取名为page
另外,不论使用哪种数据库,都的想知道数据中有几条数据,自然需要一个获取总行的SQL:
SQL形式:
select count(*) from 表名;
首先:实现分页的具体实现需要结合JDBC和Java代码实现:
分页的时,返回的参数包括查询的结果集(List),总的页数(pageCount)、当前第几页(pageNo)等等信息,所以我们封装一个查询结果Page类,当然还需要分页的一个实体类,这里我以Entity为例,具体代码:
Page.java:
//第一种实现方式:
import java.util.List;
import entity.Entity;
public class Page {
private int pageNo;//当前页数
private int hangCount;//每页显示的行数
private int sumCount;//总条数
private int sumPage;//总页数
private List entitys;//需要生成setXX()和getXX()方法
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
//给当前页赋值
if (pageNo<=1) {
this.pageNo=1;
}else if (pageNo>=this.sumPage) {
this.pageNo=this.sumPage;
}else {
this.pageNo = pageNo;
}
}
public int getHangCount() {
return hangCount;
}
public void setHangCount(int hangCount) {
this.hangCount = hangCount;
}
public int getSumCount() {
return sumCount;
}
public void setSumCount(int sumCount) {
this.sumCount = sumCount;
if(this.sumCount%this.hangCount==0){
this.sumPage = this.sumCount/this.hangCount;
}
else{
this.sumPage = this.sumCount/this.hangCount+1;
}
}
public int getSumPage() {
return sumPage;
}
public void setSumPage(int sumPage) {
this.sumPage = sumPage;
}
//List entitys 生成的setXX()和getXX()方法
}
//第二种实现方式:
import java.util.List;
import entity.Entity;
public class Page {
private int pageNo;//当前页数
private int hangCount;//每页显示的行数
private int sumCount;//总条数
private int sumPage;//总页数
private List entitys;//需要生成setXX()和getXX()方法
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public int getHangCount() {
return hangCount;
}
public void setHangCount(int hangCount) {
this.hangCount = hangCount;
}
public int getSumCount() {
return sumCount;
}
public void setSumCount(int sumCount) {
this.sumCount = sumCount;
setSumPage((getSumCount()%hangCount)==0?(getSumCount()/hangCount):(getTotalNum() /hangCount+1));
}
public int getSumPage() {
return sumPage;
}
public void setSumPage(int sumPage) {
this.sumPage = sumPage;
}
// 获取首页
public int getFirstPage() {
return 1;
}
// 获取末页
public int getLastPage() {
return sumPage;
}
// 获取上一页
public int getPrePage() {
if (pageNo > 1)
return pageNo - 1;
return 1;
}
// 获取下一页
public int getBackPage() {
if (pageNo return pageNo + 1;
return sumPage;
}
// 判断'首页'及‘上一页’是否可用
public String isPreable() {
if (pageNo == 1)
return "disabled";
return "";
}
// 判断'尾页'及‘下一页’是否可用
public String isBackable() {
if (pageNo == totalPage)
return "disabled";
return "";
}
//List entitys 生成的setXX()和getXX()方法
}
其次:编写数据数据连接类,以BaseDao为例,具体代码:
数据库驱动类名:oracle.jdbc.driver.OracleDriver
数据库连接URL:jdbc:oracle:thin:@localhost:1521:连接名
数据库用户名和密码:userName,passWord
//BaseDao.java
第一种方式:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class BaseDao{
//使用ThreadLocal是为了保证事务的一致,使得同一个线程的所有数据库操作使用同一个Connection
private static ThreadLocal threadLocal = new ThreadLocal();
public static Connection getConnection() {
Connection conn = null;
conn = threadLocal.get();
if (conn == null) {
try {
Class.forName("数据库驱动类名");
conn = DriverManager.getConnection(
"数据库连接URL", "用户名","密码");
threadLocal.set(conn);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
return conn;
}
Tomcat的组成部分 1、server
A Server element represents the entire Catalina servlet container. (Singleton) 2、service
service包括多个connector以及一个engine,其职责为处理由connector获得的客户请求。
3、connector
一个connector
基本概念: 1.OOP中唯一关系的是对象的接口是什么,就像计算机的销售商她不管电源内部结构是怎样的,他只关系能否给你提供电就行了,也就是只要知道can or not而不是how and why.所有的程序是由一定的属性和行为对象组成的,不同的对象的访问通过函数调用来完成,对象间所有的交流都是通过方法调用,通过对封装对象数据,很大限度上提高复用率。 2.OOP中最重要的思想是类,类是模板是蓝图,
由于明天举要上课,所以刚刚将代码敲了一遍PL/SQL的函数和包体的实现(单例模式过几天好好的总结下再发出来);以便明天能更好的学习PL/SQL的循环,今天太累了,所以早点睡觉,明天继续PL/SQL总有一天我会将你永远的记载在心里,,,
函数;
函数:PL/SQL中的函数相当于java中的方法;函数有返回值
定义函数的
--输入姓名找到该姓名的年薪
create or re
/*
*编写控制结构
*/
--条件分支语句
--简单条件判断
DECLARE
v_sal NUMBER(6,2);
BEGIN
select sal into v_sal from emp
where lower(ename)=lower('&name');
if v_sal<2000 then
update emp set
public class CollectionDemo implements Serializable,Comparable<CollectionDemo>{
private static final long serialVersionUID = -2958090810811192128L;
private int id;
private String nam