JDBC(5)----------數據批處理及數據庫的分頁機制實現分頁查詢

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;
	}





發佈了49 篇原創文章 · 獲贊 14 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章