分頁查詢{
實際上就是每次查詢一部分記錄,並顯示:
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.不知道怎麼編寫存儲過程
}