1、批處理
Batch是一個JDBC中的批處理操作,當擁有大量數據一次插入數據庫的時候,如果一條一條插入勢必會浪費時間,這時候,我們利用addBatch()和executeBatch()能節省大量時間;
例如:
Person1.java
public class Person1 {
int id;
String name;
String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Person1() {
super();
// TODO Auto-generated constructor stub
}
public Person1(int id, String name, String password) {
super();
this.id = id;
this.name = name;
this.password = password;
}
}
JDBCUtil.java在JDBC(3)中詳細說明
test.java測試批處理命令
@Test
public void insertPerson1(){
Connection conn = JDBCUtil.getConnection();
PreparedStatement ps = null;
String sql = "insert into person1 values(?,?,?)";
try {
int count=1;
ps = conn.prepareStatement(sql);
for(int i=1;i<100000;i++){
Person1 p = new Person1(i,"su"+i,"124"+i);
System.out.println(p);
ps.setInt(1, p.getId());
ps.setString(2, p.getName());
ps.setString(3, p.getPassword());
ps.addBatch();
count++;
if(count%1200==0){//當Batch緩衝區中有1200個數據時候,就插入數據庫一次
//最多執行百次,因爲遊標最多打開次數爲百個
ps.executeBatch();
}
}
ps.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtil.closeAll(ps, null, null);
}
}
如果想看時間差,可自行測試;
時間戳:
long time = System.currentTimeMillis();//獲取一個時間戳
2、實現分頁;
首先用java模擬一下分頁:
代碼如下:
package com.baizhi.test.forty;
import java.util.Scanner;
public class Test41 {
public static void main(String[] args) {
/*
* 加入我有這樣一個需求,一個數據庫中有110條數據,
* 現在每頁要顯示20條,用java模擬一下實現過程
*/
Scanner sc = new Scanner(System.in);
final int dataCount = 101;
final int perPageCount = 20;
int beginNum = 0;
int endNum = 0;
//首先,我要計算一下這個數據庫中的數據一共要分多少頁
int pageCount = dataCount/perPageCount+1; //一共6頁
//先判斷頁碼是否正確
System.out.println("輸入頁碼:");
int pageNum=sc.nextInt();
if(pageNum>pageCount && pageNum<0){
throw new RuntimeException("輸入頁碼有誤!");
}
//最後一頁應該是endNum爲最後一條數據
beginNum = perPageCount*(pageNum-1)+1;
if(pageNum == pageCount){
endNum = dataCount;
System.out.println(beginNum+"條數據到"+endNum+"條數據");
return ;
}
//前面5頁都是同一個算法
endNum = perPageCount*pageNum;
System.out.println(beginNum+"條數據到"+endNum+"條數據");
}
}
在JDBC操作數據庫中,實現分頁有很多種兩種非常典型的是:
a)通過ResultSet的光標實現分頁:
通過ResultSet的移動光標,可以設置ResultSet對象中記錄的起始位置和結束位置,來實現數據的分頁顯示,優點是在各種數據庫上通用,缺點是佔用大量的資源,不適合數據量大的時候。
b)通過數據庫機制進行分頁:
很多數據庫都提供了分頁機制,如SQL Server中提供的top關鍵字,MySql數據庫提供的limit關鍵字,他們可以設置返回的記錄數。
這種機制優點是減少數據庫資源的開銷,提高程序性能,缺點是隻針對一種數據庫通用。
下面介紹通過數據庫機制進行分頁的實現代碼:
@Override
/*
* 通過這個方法獲取數據庫中一共多少條數據
*/
public int dataCount() {
Connection conn = JDBCUtil.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
int pageCount = 0;
String sql = "select count(rownum) from person";
try{
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
if(rs.next()){
pageCount = rs.getInt(1);
}
}catch(Exception e){
JDBCUtil.closeAll(ps, conn, rs);
}
return pageCount;
}
核心代碼:
@Override
public List<Person> fenye(int pageNum) {
PersonDao person = new PersonDaoImpl();
List<Person> list = new ArrayList<Person>();
Connection conn = JDBCUtil.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
int dataCount = person.dataCount();
String sql = "select * from (select p.*,rownum rn from "
+ "(select * from person order by id asc) p) "
+ "where rn>=? and rn<=?";
try{
//如果一頁有2行數據 一共7條數據 組多可以分4頁
if(pageNum>(dataCount/2+1) || pageNum<1){
System.out.println("頁數超過範圍!");
return null;
}
//如果不是最後一頁beginNum和endNum標號如下
int beginNum = (pageNum-1)*2+1;
int endNum = endNum= pageNum*2;
//如果pageNum是最後一頁
if((dataCount/2+1)==pageNum){
//最後一條數據的標號是數據的總條數
endNum = dataCount;
}
ps = conn.prepareStatement(sql);
ps.setInt(1, beginNum);
ps.setInt(2, endNum);
rs = ps.executeQuery();
while(rs.next()){
Person p = new Person(
rs.getInt(1),
rs.getString(2),
rs.getString(3),
rs.getString(4),
rs.getString(5),
rs.getString(6),
rs.getDate(7)
);
list.add(p);
}
}catch(Exception e){
JDBCUtil.closeAll(ps, conn, rs);
}
return list;
}