java自學之路-----jdbc_分頁查詢,大數據,批處理,存儲過程

分頁查詢{

實際上就是每次查詢一部分記錄,並顯示:

select * from table_name limit StartIndex, PageSize;——>StartIndex:從第幾個記錄開始查。PageSize:每次查多少記錄

分頁查詢在javaweb中的案例:


//該對象封裝了分頁查詢的配置信息,用於dao層
public class QueryInfo {
	private int startindex;//查詢的每頁在數據庫的起始位置,該值可以根據其他參數計算出,不需要set屬性
	private int pagesize = 5;//查詢的每頁記錄數,賦一個初始值
	private int querypage = 1;//查詢第幾頁,賦一個初始值
	//提供get,set方法,便於設置,獲取屬性值
	public int getStartindex() {
		this.startindex = (this.querypage-1) + 1;
		return startindex;
	}
	public int getPagesize() {
		return pagesize;
	}
	public void setPagesize(int pagesize) {
		this.pagesize = pagesize;
	}
	public int getQuerypage() {
		return querypage;
	}
	public void setQuerypage(int querypage) {
		this.querypage = querypage;
	}
}

//該類封裝了分頁查詢的結果信息,作爲中間值,用於給QueryBean提供信息
public class QueryResult {
	private List list;//封裝了查詢後某頁的所有記錄
	private int totalrecord;//總記錄數,用於給用戶提供交互信息
//	提供屬性的get,set方法,
	public List getList() {
		return list;
	}
	public void setList(List list) {
		this.list = list;
	}
	public int getTotalrecord() {
		return totalrecord;
	}
	public void setTotalrecord(int totalrecord) {
		this.totalrecord = totalrecord;
	}
}

//該類封裝了分頁查詢的所有信息,用於與用戶交互,用於jsp頁面,web層
public class QueryBean {
	private List list;//封裝查詢的所有記錄信息
	private int totalrecord;//告訴用戶總共有多少記錄,可以從QueryResult對象獲取
	private int pagesize;//告訴用戶每頁有多少記錄,從QueryInfo對象獲取
	private int totalpage;//告訴用戶一共有多少頁,可以通過totalrecord和pagesize計算
	private int currentpage;//告訴用戶當前查看的是第幾頁,從QueryInfo對象獲取
	private int previouspage;//上一頁是第幾頁,通過當前頁計算出
	private int nextpage;//下一頁是第幾頁,通過當前頁計算出
	private int[] pagebar;//記錄頁碼條,通過currentpage和pagesize計算出的一個數組
//	提供所有屬性的get,set方法
	public int getTotalrecord() {
		return totalrecord;
	}
	public void setTotalrecord(int totalrecord) {
		this.totalrecord = totalrecord;
	}
	public int getPagesize() {
		return pagesize;
	}
	public void setPagesize(int pagesize) {
		this.pagesize = pagesize;
	}
	public int getTotalpage() {
//		計算總頁數,21條,每頁5條,有5頁。20條,每頁5條,有4頁。
		if(this.totalrecord%this.pagesize == 0){
			this.totalpage = this.totalrecord / this.pagesize;
		}else{
			this.totalpage = this.totalrecord / this.pagesize + 1;
		}
		return totalpage;
	}
	public int getCurrentpage() {
		return currentpage;
	}
	public void setCurrentpage(int currentpage) {
		this.currentpage = currentpage;
	}
	public int getPreviouspage() {
		this.previouspage = this.currentpage - 1;
//		如果當前頁小於等於0,就指向第一頁
		if(this.previouspage<=0){
			this.previouspage = 1;
		}
		return previouspage;
	}
	public int getNextpage() {
		this.previouspage = this.currentpage - 1;
//		如果當前頁小於等於0,就指向最後一頁
		if(this.nextpage<=0){
			this.nextpage = 1;
		}
		return nextpage;
	}
	public int[] getPagebar() {
		int startindex;
		int endindex;
//		如果總頁數小於10
		if(this.pagesize <= 10){
			startindex = 1;
			endindex = this.pagesize;
		}else{
			startindex = this.currentpage - 4;
			endindex = this.currentpage + 5;
//			如果startindex小於1,就從0開始,如果endindex大於總頁數,就用總頁數作爲結束
			if(startindex < 1){
				startindex = 1;
				endindex = 10;
			}
			if(endindex > this.pagesize){
				startindex = this.pagesize - 9;
				endindex = this.pagesize;
			}
		}
//		更具兩個索引值定義數組pagebar
		this.pagebar = new int[endindex-startindex+1];
//		爲數組賦值
		for (int i = 0; i < pagebar.length; i++) {
			this.pagebar[i] = startindex++;
		}		
		return pagebar;
	}
}
//	在dao層提供一個分頁查詢的方法,將索引的初始位置和每頁記錄數傳入
	public QueryResult pageQuery(int startIndex, int pageSize){
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		try {
//			獲取數據庫連接
			conn = JdbcUtils.getConnection();
//			提供分頁查詢的sql語句
			String sql = "select * from customer limit ?,?";
//			預編譯sql語句,獲得preparedstatement對象
			st = conn.prepareStatement(sql);
//			爲佔位符'?' 賦值
			st.setInt(1, startIndex);
			st.setInt(2, pageSize);
//			執行sql語句,獲得結果集
			rs = st.executeQuery();
//			將結果封裝到QueryResult對象中
				//在service層,將該對象封裝到QueryBean中,傳給jsp用於顯示
			...
		} catch (Exception e) {
		}finally{
			JdbcUtils.release(conn, st, rs);
		}
	}

}


大數據{

用處:程序需要將大文本或二進制數據保存到數據庫中,一般在實際開發中不直接使用數據庫存儲大文本大數據,因爲在存取操作的時候,會佔用連接大量的時間。
大數據(Large Objects):
clob:存儲大文本,text文件
blob:存儲二進制數據,如圖像,音頻、二進制文

mysql中用Text代替clob:

Text:Tinytext,text,mediumtext,longtext

blob:tinyblob,blob,mediumblob,longblob

大文本(Text){

存:

PreparedStatement的setCharacterStream( 1, reader, length)方法,填充佔位符

//		定義sql語句
		String sql = "insert into testclob(id,resum) values(?,?)";
//		預編譯sql
		PreparedStatement st = conn.prepareStatement(sql);
//		賦值佔位符
		st.setString(1, "1");
//		不建議用類裝載器讀取文件,因爲文本內容可能太大,不適合讀取至內存中
		File file = new File("src/1.txt");
		Reader reader = new FileReader(file);
		st.setCharacterStream(2, reader, file.length());//reader:一個讀取文本的流 length:文本的大小
//										 這是long型的,使用1.6一下的jdk必須將其轉成int

讀:

reader = resultSet.getCharacterStream(i);

reader = resultSet.get Clob(i).getCharacterStream();

String s = resultSet.getSting(i);

//		定義sql語句
		String sql = "select * from testclob where id= '1'";
//		預編譯sql
		PreparedStatement st = conn.prepareStatement(sql);
//		無佔位符直接執行sql
		ResultSet rs = st.executeQuery();
//		通過結果集獲取大數據文件
		while(rs.next()){
			String id = rs.getString(1);
//			將數據庫的文本數據放在一個流中,供用戶使用
			Reader reader = rs.getCharacterStream(2);
//			讀取數據
			Writer writer = new FileWriter("src/2.txt");
			...
		}


}

二進制(Blob){

存:

PreparedStatement的setBinaryStream(i, inputStream, length)方法,填充佔位符

//		定義sql語句
		String sql = "insert into testblob(id,image) values(?,?)";
//		預編譯sql
		PreparedStatement st = conn.prepareStatement(sql);
//		賦值佔位符
		st.setString(1, "1");
//		不建議用類裝載器讀取文件,因爲文本內容可能太大,不適合讀取至內存中
		File file = new File("src/1.jpg");
		InputStream inputStream = new FileInputStream(file); 
		st.setBinaryStream(2, inputStream, file.length());//inputStream:一個讀取文本的流 length:文本的大小
//										 這是long型的,使用1.6一下的jdk必須將其轉成int


讀:查看數據不能直接通過命令行程序讀取

inputStream = resultSet.getBinaryStream(i);

inputStream = resultSet.getBlob(i).getBinaryStream();

//		定義sql語句
		String sql = "select * from testblob where id= '1'";
//		預編譯sql
		PreparedStatement st = conn.prepareStatement(sql);
//		無佔位符直接執行sql
		ResultSet rs = st.executeQuery();
//		通過結果集獲取大數據文件
		while(rs.next()){
			String id = rs.getString(1);
//			將數據庫的文本數據放在一個流中,供用戶使用
			InputStream in = rs.getBinaryStream(2);
//			存儲數據
			OutputStream out = new FileOutputStream("c:\\2.jpg");
			...


}

}

批處理{

用處:當需要向數據庫發送一批SQL語句執行時,應避免向數據庫中一條條的發送執行,應該採用批處理機制,提升效率

第一種實現方式{

存儲sql語句:Statement.addBatch(sql);

執行批處理語句:executeBatch()-->執行批處理命令 clearBatch();-->清除批處理命令

//		定義sql語句
		String sql1 = "insert into testBatch(id,name) values('1', 'aaa')";
		String sql2 = "update testBatch set name = 'bbb' where id = '1'";
//		獲取Statement對象
		Statement st = conn.createStatement();
//		將sql語句存到對象中,實際是將sql語句存放在內部的list對象中
		st.addBatch(sql1);
		st.addBatch(sql2);
//		執行sql
		int result[] = st.executeBatch();//該數組一次存放着每一條sql語句影響數據庫數據的行數
//		清除
		st.clearBatch();

1.可以發送不同的sql語句

2.性能不夠

}

第二種實現方式{

//		定義sql語句
		String sql = "insert into testBatch(id,name) values(?,?)";
//		獲取PreparedStatement對象
		PreparedStatement st = conn.prepareStatement(sql);
////		替換佔位符,第一個sql,存到list中
//		st.setString(1, "1");
//		st.setString(2, "aaa");
//		st.addBatch();
////		替換佔位符,第二個sql,存到list中
//		st.setString(1, "2");
//		st.setString(2, "bbb");
//		st.addBatch();
		//例:
		for(int i=0; i<10; i++){
			st.setString(1, ""+i);
			st.setString(2, "aa"+i);
			st.addBatch();
		}
//		執行
		st.executeBatch();
//		清除
		st.clearBatch();

1.只能發送相同sql語句,比較適合作爲批量插入或批量更新

2.預先編譯,提升性能

}

		//如果批處理的語句過多,可能造成內存溢出:使用下列處理方法
		for(int i=0; i<100000; i++){
			st.setString(1, ""+i);
			st.setString(2, "aa"+i);
			st.addBatch();
//			每次處理1000條sql語句
			if(i%1000==0){
				st.executeBatch();
				st.clearBatch();
			}
		}
//		以防sql語句未執行
		st.executeBatch();
//		清除
		st.clearBatch();


}

存儲過程{

該對象作用:

1.相當於數據庫的一個方法,在數據庫中處理數據,然後再java程序中直接獲取數據

2.沒有該對象就需要使用jdbc調用來處理數據

3.一般都用在金融證券領域,都內部寫了存儲過程,程序員直接調用。

4.存儲過程中一般在參數中指定了輸入數據,和輸出數據

用法:

1.先在數據庫中註冊一個存儲過程


2.在java程序中使用

//		獲取連接,通過數據庫的方法,先得到一個數據,處理後再輸出
		Connection conn = JdbcUtils.getConnection();
//		用存儲過程名來獲取存儲過程的對象
		CallableStatement st = conn.prepareCall("{call demoSp(?,?)}");//通過demoSp這個名字調用存儲過程
//		替換佔位符
			//輸入的數據
		st.setString(1, "aaa");
			//輸出的數據,提供輸出的類型
		st.registerOutParameter(2, Types.VARCHAR);//Types封裝了數據庫中常用類型
		st.execute();
//		通過第二個?獲得數據,並且它已經指定了數據類型
		st.getString(2);

問題:1.只知道存儲過程在java程序中的輸入,輸出關係。不知道會對數據庫造成怎樣的影響  2.不知道怎麼編寫存儲過程

}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章