摘要:目前數(shù)據(jù)庫的應(yīng)用非常普遍,在應(yīng)用程序的開發(fā)過程中,經(jīng)常會(huì)涉及到訪問數(shù)據(jù)庫。Java使用JDBC技術(shù)進(jìn)行數(shù)據(jù)庫的訪問。查詢是數(shù)據(jù)庫的操作中較為頻繁的一種操作,返回的結(jié)果有時(shí)可能是很多條記錄的結(jié)果集,用戶在瀏覽和處理時(shí)不方便,常常會(huì)用到分頁處理功能。
關(guān)鍵詞:JDBC數(shù)據(jù)庫;驅(qū)動(dòng)程序;結(jié)果集 中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2007)06-11511-01 1 JDBC技術(shù) JDBC(Java Database Connectivity)是Sun提供的一套數(shù)據(jù)庫編程接口API函數(shù),由Java語言編寫的類和接口組成。JDBC為數(shù)據(jù)庫開發(fā)人員提供了一個(gè)標(biāo)準(zhǔn)的API,使用Java編程語言和JDBC結(jié)合編寫的應(yīng)用程序,無須考慮要為不同的平臺(tái)編寫不同的應(yīng)用程序。真正實(shí)現(xiàn)“Write Once,Run Everywhere!”。 2 JDBC編程實(shí)現(xiàn) 使用JDBC技術(shù)進(jìn)行數(shù)據(jù)庫訪問時(shí),Java應(yīng)用程序通過JDBC API和JDBC驅(qū)動(dòng)程序管理器之間進(jìn)行通信,JDBC驅(qū)動(dòng)程序管理器以兩種方式和最終的數(shù)據(jù)庫進(jìn)行通信:一是使用JDBC-ODBC橋驅(qū)動(dòng)程序的間接方式,另一種是使用JDBC驅(qū)動(dòng)程序的直接方式。 下面以JDBC驅(qū)動(dòng)程序的直接方式為例,說明Java語言與SQL Server2000連接的JDBC編程的全過程: (1)加載驅(qū)動(dòng)程序 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); (2)通過DriverManager到得一個(gè)與數(shù)據(jù)庫連接的句柄 private static String url="jdbc:microsoft:sqlserver://localhost:1433;databasename=xxxx "; Connection con = DriverManager.getConnection(url, user,password); (3)通過連接句柄綁定要執(zhí)行的語句 Statement stmt = con.createStatement(); (4)接收?qǐng)?zhí)行結(jié)果 ResultSet rs=stmt.executeQuery(sql); 或ResultSet rs=stmt.executeUpdate(sql); (5)對(duì)結(jié)果進(jìn)行處理 調(diào)用get XXX()方法對(duì)獲取結(jié)果中的值。 (6)關(guān)閉與數(shù)據(jù)庫的連接 rs.close(); stmt.close(); con.close(); 3 JDBC編程結(jié)果集分頁顯示 在ResultSet類中提供了一套數(shù)據(jù)的分頁處理功能。 3.1 技術(shù)要點(diǎn) (1)createStatement()方法: public Statement createStatement() 獲取默認(rèn)連接聲明,沒有指針操作 public Statement createStatement(int resultSetType,int resultSetConcurrency) resultSetType決定結(jié)果集類型的滾動(dòng)方式,它的取值為:ResultSet.TYPE_FORWARD_ONLY、Result.TYPE_SCROLL_INSENSITIVE和ResultSet.TYPE_SCROLL_SENSITIVE resultSetConcurrency決定是否可以用結(jié)果集更新數(shù)據(jù)庫。它的取值為:Result.CONCUR_READ_ONLY 、Result.CONCUR_UPDATETABLE (2)ResultSetMetaData結(jié)果集元對(duì)象類 結(jié)果集元數(shù)據(jù)通過使用getMetaData()來獲得結(jié)果集元對(duì)象。ResultSetMetaData結(jié)果集元對(duì)象類的方法: getColumnCount() getColumnName(int index) getColumnTypeName(int index) 3.2 建立數(shù)據(jù)庫 在SQL Server 2000下建立一個(gè)名為book的數(shù)據(jù)庫,在book數(shù)據(jù)庫下建立一個(gè)圖書信息表bookInfo,表的結(jié)構(gòu)為:bookInfo(no,bookname,author,price,public) 3.3 Java源程序 為了使得程序具有一定的通用性和靈活性,將要顯示的號(hào)碼和每頁的大小(每頁的記錄數(shù))由命令行輸入。即命令行參數(shù)arg[0]代表pageno,參數(shù)arg[1] 代表pagesize。源程序JDBCScrollDisplay.java如下: import java.sql.*; public class JDBCScrollDisplay{ private static String url="jdbc:microsoft:sqlserver://localhost:1433;databasename=book"; private static String username="sa"; private static String password="sa"; public Connection conn(){ try { Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); Connection con = DriverManager.getConnection(url, username, password); return con; } catch(SQLException e1){ System.out.println("can't connection db:"+e1); return null; } catch (Exception e2) { System.out.println("Failed to load JDBC driver."); return null; } } public void query(Connection con, String sql,int pageNo,int pageSize){ try{ if(con==null){ throw new Exception("database connection can't use!"); } if(sql==null){ throw new Exception("check your parameter: 'sql'! don't input null!"); } int rowCount; //記錄總數(shù) int pageCount; //總頁數(shù) Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ResultSet rs = stmt.executeQuery(sql); //執(zhí)行查詢 ResultSetMetaData rmeta = rs.getMetaData();//獲得數(shù)據(jù)字段個(gè)數(shù) int numColumns = rmeta.getColumnCount(); rs.last(); rowCount = rs.getRow(); pageCount = (rowCount +pageSize-1)/pageSize; //計(jì)算總頁數(shù) if(pageNo> pageCount) pageNo=pageCount; //調(diào)整待顯示的頁碼 if(pageCount >0){ rs.absolute((pageNo-1)*pageSize+1); //將記錄指針定位到待顯示頁的第一條記錄上 int i = 0; while(i){ for(int j = 0;j< numColumns;j++) { String sTemp = rs.getString(j+1); System.out.print(sTemp+" "); } i++; rs.next(); System.out.println(""); } } } catch(Exception e){ System.out.println("query error:"+e); } } public void demo(int pageNo,int pageSize){ try{ JDBCScrollDisplay jd = new JDBCScrollDisplay(); Connection con = jd.conn(); String sql = "select * from bookInfo order by no"; jd.query(con,sql,pageNo,pageSize); con.close();} catch(SQLException se){ System.out.println(se);} catch(Exception e){System.out.println(e);}} public static void main(String[] arg){ JDBCScrollDisplay jsd = new JDBCScrollDisplay(); int pageno = Integer.parseInt(arg[0]); int pagesize = Integer.parseInt(arg[1]); jsd.demo(pageno,pagesize);}} 4 結(jié)束語 JDBC是Java的一個(gè)標(biāo)準(zhǔn)SQL數(shù)據(jù)庫訪問接口,它為數(shù)據(jù)庫應(yīng)用開發(fā)人員、數(shù)據(jù)庫前臺(tái)工具開發(fā)人員提供一種標(biāo)準(zhǔn)的應(yīng)用程序設(shè)計(jì)接口。開發(fā)人員只需使用JDBC提供的類,調(diào)用這些類的方法,即可對(duì)數(shù)據(jù)庫進(jìn)行訪問,而無需關(guān)心所使用的具體是什么數(shù)據(jù)庫系統(tǒng)。在實(shí)際的使用中經(jīng)常會(huì)遇到要提供可滾動(dòng)的結(jié)果集,只需要在使用分頁數(shù)據(jù)時(shí)先聲明是一個(gè)可移動(dòng)的SQL語句。上例可以任何應(yīng)用在對(duì)數(shù)據(jù)庫做任意操作的基礎(chǔ)上,再分頁顯示。 |
|