????? 把以前學習的東西寫出來,以便在以后的學習和工作中可以用到!這里我主要是把自己關于數據庫學習的一些東西給寫出來。
????? JDBC提供一套訪問關系數據庫的標準庫。通過JDBC API,我們可以使用完全相同的Java語法訪問各式各樣的SQL數據庫。正式來將JDBC不是一個首字母的縮寫詞,因此,它不代表任何事情。”Java Database Connectivity”通常是該名稱的完整形式。
通常查詢數據庫可以用7個標準步驟來說明:
(1).載入JDBC驅動程序
如果要載入驅動程序,只需要在Class.forName方法中指定數據庫驅動類名。這樣做就自動創建驅動程序的實例,并注冊到JDBC驅動程序管理器。(注:ForName方法返回給定名稱的類的對象,調用該對象相當于調用Class.forName)
(2)定義連接URL(connection URL)
在JDBC中,連接URL指定服務器的主機名,端口以及希望與之建立連接的數據庫名
(3)建立連接
有了連接URL,用戶名和密碼,就可以建立到數據庫的網絡連接。連接建立之后,就可以執行數據庫的查詢,直到連接為止
(4)創建Statement對象
創建Statement才能向數據庫發送查詢和命令
(5)執行查詢或更新
有了Statement對象后,就可以用execute,executeQuery,executeUpdate或executeBatch方法發送SQL語句到數據庫
(6)結果處理
數據庫執行查詢完畢之后,返回一個ResultSet。ResultSet表示一系列的行和列,可以調用next和各種getXXX方法對這些行和列進行處理。
(7)關閉連接
這點比較重要,一定要記得關閉連接,釋放與數據庫的資源。這樣可以提高效率。
裝載JDBC驅動程序
因為在裝載JDBC驅動程序用的是顯示的Class.forName所以一定要寫在try{}catch{}塊中。由于可能會發生ClassNotFoundException所以應當捕獲這個異常. Example:
Try
{
Class.forName(“connect.microsoft.MicrosoftDriver”);
Class.forName(“oracle.jdbc.driver.OracleDriver”);
Class.forName(“com.sybase.jdbc.SybDriver”);
}
Catch(ClassNotFoundException e)
{
?out.println(e.getMessage());
}
我們在部署的時候應當注意是把JDBC的驅動程序JAR文件部署到install_dir/common/lib也可以部署到WEB-INF/lib目錄中。
建立連接
在建立實際連接的時候,需要將URL,數據庫名字和用戶名都傳給DriverManager類的getConnection方法,由于getConnection有可能會產生異常因此我們應該把這些代碼寫在try{}catch{}中. Eg:
String URL=”jdbc:oracle:thin:@”+host+”:”+port+”:”+dbName;
String UID=”Database user name”;
String PWD=”Database password”;
Try
{
Conection con=DriverManager.getConnection(URL,UID,PWD);
}
Catch(SQLException e)
{
? e.getMessage();
}
Conection類還包括其他的一些用法!如下:
prepareStatement
創建預編譯查詢,提交給數據庫
prepareCall
訪問數據庫中的存儲過程。
Rollbach/commit
控制事務管理
Close
關閉連接
isClosed
確定連接是否超時或被顯示關閉
建立連接過程,一個可選部分是使用getDataMeta方法查找數據庫的相關信息,這個方法返回DatabaseMetaData對象,該對象擁有相應的方法,可以得出數據庫自身的名稱和版本(getDatabaseProductName,getDatabaseProductVersion),或者 JDBC驅動程序的名稱和版本(getDriverName,getDrvierVersion).例如:
DatabaseMetaData dbMetaData=connection.getDataMeta();
String productName=
dbMetaDate.getDatabaseProductName();
System.out.println(“Database:”+productName);
String produtcVersion=
?? dbMetaDate.getDatabseProductVersion();
System.out.println(“Version:”+productVersion);
創建Statement對象
Statement對象用來向數據庫發送查詢和命令。它由Conection的createStatement()方法創建:
Statement stmt=connection.createStatement();
執行查詢或更新
有了Statement對象后,就可以用它的executeQuery方法發送SQL查詢,executeQuery返回ResultSet類型對象。Eg:
String sql=”select * from emp”;
ResultSet rs=stmt.execute?Query(sql);
Statement的其他的用法:
executeQuery
執行SQL查詢并在ResultSet中返回數據.ResultSet可能為空,但不會為NULL。
executeUpdate
用于UPDATE,INSERT或DELETE命令。返回受影響的行數,可以為0,它還提供對DDL(Data Definition Language)命令的支持,例如CREATE TABLE,DROP TABLE和ALTER TABLE。
executeBatch
將一組命令作為一個單元執行,返回一個數組,其中存儲每個計數的更新計數。addBatch可以向批量執行的命令中添加命令。
setQueryTimeout
指定驅動程序在拋出SQLException異常之前,等待處理結果的時間。
getMaxRows/setMaxRows
確定ResultSet可容納的最大行數。超過的行將會在不給出任何警告的情況下丟棄。默認值為0,表示沒有限制。
結果處理
結果處理最簡單的方式就是用ResultSet的Next方法在表中移動,每次一行。(注:ResultSet中行的第一列索引為1,而非0).建議在訪問 ResultSet的列時不要使用索引,而使用列名。使用這種方式在表的結構發生改變時,與ResultSet交互的代碼不容易出錯誤。
ResultSet的一些方法集:
Next/previous
將ResultSet中的游標分別移動到下一行。
Relative/absolute
Relative方法將游標相應的地移動特定數目行,或正或負(向前或向后)。Absolute方法將游標移動到指定的行號。如果絕對值是負數,那么游標將相對于ResultSet的結尾進行定位(JDBC2.0)。
getXxx
返回Xxx Java類型(參見java.sql.Types)的值,這個值來自于列名或索引指定的列。如果列的值為SQL的NULL值,那么則返回0或NULL。
wasNull
檢查上面的getXxx讀到的是否為SQL的NULL值。如果列的類型為基本類型(int,float等),且數據庫中的值為0,那么這項檢查就很重要。由于數據庫的NULL返回0,所以0和數據庫的NULL不能區分開來。如果列的類型為對象(String,Date等),可以簡單的將返回值與NULL比較。
findColumn
返回ResultSet中與指定列名對應的索引。
getRow
返回當前的行號,第一行從1開始。
getMetaData
返回描述ResultSet的ResultSetMetaData對象。ResultSetMetaData給出列的數目和名稱。
getMetaData方法尤為有用。僅僅有ResultSet的情況下我們必須知道列的名稱,數目和類型才能正確的對表進行處理。ResultSetMetaData的方法集:
getColumnCount
返回ResultSet中列的數目。
getColumnName
返回列在數據庫中的名稱.
getColumnType
返回列的SQL類型,對應于java.sql.Types中的項。
isReadOnly
表示數據是否為只讀。
isSerachable
表明給列是否可以用在WHERE字句中。
isNullable
表明該列是否可以存儲NULL。
(注J: ResultSet和ResultSetMetaData沒有直接提供方法返回查詢所返回的行數,然而,在JDBC2.0中,可以用last將游標定位于ResultSet最后一行,然后調用getRow獲取當前的行號。)
關閉連接
顯示的關閉連接:
connection.close();
可以參考以下以下的例子:
import java.sql.*; import java.io.*; /** * <p>Title: JDBC連接數據庫</p> * <p>Description: 本實例演示如何使用JDBC連接Oracle數據庫,并演示添加數據和查詢數據。</p> */publicclass JDBCConn{private String url="";//數據庫連接字符串private String username="";//數據庫用戶名private String password="";//數據庫密碼 ? /** *<br>方法說明:獲得數據連接 *<br>輸入參數: *<br>返回類型:Connection 連接對象 */public Connection conn(){try{ ??//第一步:加載JDBC驅動 Class.forName("oracle.jdbc.driver.OracleDriver"); //第二步:創建數據庫連接 Connection con =DriverManager.getConnection(url, username, password); return con; }catch(ClassNotFoundException cnf){ ??System.out.println("driver not find:"+cnf); ??returnnull; }catch(SQLException sqle){ ??System.out.println("can't connection db:"+sqle); ??returnnull; } ??catch (Exception e) { System.out.println("Failed to load JDBC/ODBC driver."); returnnull; }}/** *<br>方法說明:執行查詢SQL語句 *<br>輸入參數:Connection con 數據庫連接 *<br>輸入參數:String sql 要執行的SQL語句 *<br>返回類型:void */publicvoid query(Connection con, String sql){try{if(con==null){thrownew Exception("database connection can't use!"); }if(sql==null) thrownew Exception("check your parameter: 'sql'! don't input null!"); //第三步:獲取Staetment對象 Statement stmt = con.createStatement(); //第四步:執行數據庫操作(查詢操作) ResultSet rs = stmt.executeQuery(sql); //第五步:處理結果集 ?? ResultSetMetaData rmeta = rs.getMetaData(); ?? //獲得數據字段個數int numColumns = rmeta.getColumnCount(); while(rs.next()) ?? { ?? for(int i = 0;i< numColumns;i++) ?? { ????String sTemp = rs.getString(i+1); ????System.out.print(sTemp+" "); ?? } ?? System.out.println(""); ?? }}catch(Exception e){ System.out.println("query error:"+e); }}/** *<br>方法說明:執行插入、更新、刪除等沒有返回結果集的SQL語句 *<br>輸入參數:Connection con 數據庫連接 *<br>輸入參數:String sql 要執行的SQL語句 *<br>返回類型:void */publicvoid execute(Connection con, String sql){try{if(con==null) return; //第三步:獲取Statement對象 ?? Statement stmt = con.createStatement(); //第四步:執行數據庫操作(更新操作) ?? stmt.executeUpdate(sql); ?? System.out.println("update executed successly"); }catch(Exception e){ System.out.println("execute error: sql = "+sql); System.out.println(e); }//end try catch}//end execute/** *<br>方法說明:實例演示 *<br>輸入參數:無 *<br>返回類型:void */publicvoid demo(){ String sSQL=""; BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in)); try{ System.out.println("please input update SQL string"); sSQL=stdin.readLine();//獲取命令行輸入(更新字符串) Connection conn = conn();//執行自定義連接方法(獲取數據庫連接對象) execute(conn,sSQL);//執行自定義更新方法 String sql = "select * from TBL_USER"; query(conn,sql);//執行自定義查詢方法(查詢并處理結果集)//第六步:關閉數據庫連接 conn.close(); }catch(SQLException se){ System.out.println(se); }catch(Exception e){ System.out.println(e); } ? }/** *<br>方法說明:主方法 *<br>輸入參數:String[] args 命令行參數(包括:數據庫連接URL, *<br>用戶名,密碼) *<br>返回類型:void */publicstaticvoid main(String[] arg){if(arg.length!=3){ System.out.println("use: java JDBCConn url username password"); return; } JDBCConn oc = new JDBCConn(); oc.url = arg[0]; oc.username=arg[1]; oc.password=arg[2]; oc.demo(); }}