Posted on 2006-11-03 10:14
Coolfiry 閱讀(237)
評論(0) 編輯 收藏 所屬分類:
Java
JDBC學習筆記
2004-9-13?????星期一?????小雨
l.?連接到數據庫的方法
答:1)?ODBC(Open?Database?Connectivity)
???????一個以C語言為基礎訪問SQL為基礎數據庫引擎的接口,它提供了一致的接口用于和數據庫溝通以及訪問數據。
????2)?JDBC
???????Java版本的ODBC
2.?JDBC應用編程接口
答:JDBC應用編程接口是:
????1)?標準的數據訪問接口,可以連到不同的數據庫;
????2)?JAVA編程語言的一組類和接口。
????JDBC應用編程接口能夠:
????1)?連接到數據庫;
????2)?發SQL查詢字符串到數據庫;
????3)?處理結果。
????JDBC應用編程接口有二個主要的部分:
????1)?JAVA應用程序開發接口面向JAVA應用程序開發者;
????2)?JDBC驅動程序開發接口
????
3.?JDBC?Driver
答:1)?一大堆實現了JDBC類和接口的類;
????2)?提供了一個實現java.sql.Driver接口的類。
4.?JDBC?Driver的四種類型
答:1)?JDBC-ODBC橋
????由ODBC驅動提供JDBC訪問
????2)?本地API
????部分Java?driver把JDBC調用轉化成本地的客戶端API
????3)?JDBC-net
????純的Java?driver,將JDBC調用轉入DBMS,與網絡協議無關。然后通過服務器將調用轉為DBMS協議。
????4)?本地協議
????純的java?driver,將JDBC調用直接轉為DBMS使用的網絡協議
5.?JDBC開發者接口
答:1)?java.sql--java?2平臺下JDBC的主要功能,標準版(J2SE)
????2)?javax.sql--java?2平臺下JDBC增強功能,企業版(J2EE)
6.?使用URL確認數據庫
答:我們使用URL來確定一個數據庫(正確的Driver,正確的主機,正確的協議,正確的協議,正確的用戶名和密碼);
????語法:protocol:subprotocol:subname
????范例:jdbc:db2:MyTest
??????????jdbc:db2://localhost:6789/MyTest
7.?javax.sql包JDBC2.0的增強功能
答:1)?數據源接口;
????2)?連接池;
????3)?分布式交易;
????4)?行集;
8.?創建一個基本的JDBC應用
答:1)?步驟一:注冊一個driver;
????2)?步驟二:建立一個到數據庫的連接;
????3)?步驟三:創建一個statement;
????4)?步驟四:執行SQL語句;
????5)?步驟五:處理結果;
????6)?步驟六:關閉JDBC對象
9.?注冊一個Driver(步驟一)
答:1)?driver被用于連接到數據庫;
????2)?JDBC應用編程接口使用第一個能成功連接到給定URL的driver;
????3)?在同一時間可以裝載多個driver
10.注冊一個driver的方法:
答:1)?使用類loader(裝載;實例化;注冊入DriverManager)
???????a.?Class.forName("Com.ibm.db2.jdbc.app.DB2Driver");
???????b.?Class.forName("Com.ibm.db2.jdbc.net.DB2Driver");
???????c.?Class.forName("Com.microsoft.jdbc.sqlServer.SQLServerDriver);
???????d.?Class.forName("oracl.jdbc.driver.OracleDriver");
???????e.?Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
????2)?實例化一個Driver
???????a.?Driver?drv?=?new?COM.cloudscape.core.RmiJdbcDriver();
2004-9-14?????星期二?????陰
1.?建立一個到數據庫的連接(步驟二)
答:DriverManager調用getConnection(urlString)方法,實際上調用的是driver的connect(urlString)方法;
????1)?當一個driver肯定地對應到一個數據庫URL,DriverManager建立一個連接;
????2)?當沒有driver匹配,返回null然后下一個driver被檢驗;
????3)?假如沒有建立連接,拋出一個SQLExcepiton異常
2.?經常使用的一些JDBC?URL
答:1)?JDBC-ODBC:?jdbc:odbc:<DB>
????2)?Oracle:?jdbc:oracle:oci:@<sid>?or?jdbc:oracle:thin:@<SID>
????3)?Weblogic?MS-SQL:?jdbc:weblogic:mssqlserver4:<DB>@<HOST>:<PORT>
????4)?DB2:?jdbc:db2:MyTest?or?jdbc.db2://localhost:6789/MyTest(需要用戶名和密碼)
3.?Driver連接方法
答:1)?創建一個到指定Driver實例的直接調用;
????2)?避免一般訪問的問題
???????Driver?drv?=?new?COM.ibm.db2.jdbc.app.DB2Driver();
???????Connection?con?=?null;
???????try?{con?=?drv.connect("jdbc:db2:MyTest",new?Properties())}
???????catch(SQLException?e){}
4.?創建一個Statement(步驟三)
答:1)?Statement的三個接口:
???????a.?Statement;
???????b.?PreparedStatement(繼承自Statement);
???????c.?CallableStatement(繼承自PreparedStatement);
????2)?使用方法Connection.createStatement()得到一個Statement對象
5.?PreparedStatement對象
答:1)?調用ProparedStatement比statement更為高效;
????2)?繼承自Statement;
????3)?語法:PreparedStatement?pstm?=?connection.prepareStatement(sqlString);
6.?CallableStatement對象
答:1)?通過CallableStatement調用數據庫中的存儲過程;
????2)?繼承自PreparedStatement;
????3)?CallableStatement?cstm?=?connection.prepareCall("{call?return_student[?,?]}");
???????cstm.setString(1,"8623034");
???????cstm.registerOutparameter(2,?Types.REAL);
???????cstm.execute();
???????float?gpa?=?cstm.getFloat(2);
7.?Statement接口的比較
答:?????????????|?Statement???????????|?PreparedStatement?????????|??CallableStatement
????------------------------------------------------------------------------------
????寫代碼位置???|???客戶端????????????|?客戶端????????????????????|??服務器端
????------------------------------------------------------------------------------
????寫代碼位置???|???客戶端????????????|?服務器端??????????????????|??服務器端
????------------------------------------------------------------------------------
????編寫代碼技術?|Java,SQL操作????????|Java,SQL操作??????????????|??數據庫的程序語言,如PL/SQL
????------------------------------------------------------------------------------
????可配置性?????|???高????????????????|第一次高,以后低???????????|??低
????------------------------------------------------------------------------------
????可移植性?????|???高????????????????|假設支持PreparedStatement的話高????
????------------------------------------------------------------------------------
????傳輸效率?????|???低????????????????|第一次低,以后高???????????|??高
8.?執行SQL?Statement(步驟四)
答:通過接口方法將SQL語句傳輸至?認的數據庫連接,返回結果可能是一個數據表,可以通過java.sql.ResultSet訪問。
????1)?Statement的接口方法:
????a.?executeQuery(sqlString):?執行給定的SQL聲明,返回一個結果集(ResultSet)對象;
????b.?executeUpdate(sqlString):?執行給定的SQL聲明,可以是INSERT、UPDATE或DELETE聲明,也可以是SQL?DDL聲明;
????c.?execute(sqlString):?執行給定的SQL聲明。
9.?處理結果(步驟五)
答:1)?使用結果集(ResultSet)對象的訪問方法獲取數據;
???????a.?next():下一個記錄
???????b.?first():第一個記錄
???????c.?last():最后一個記錄
???????d.?previous():上一個記錄
????2)?通過字段名或索引取得數據
????3)?結果集保持了一個指向了當前行的指針,初始化位置為第一個記錄前。
10.?關閉JDBC對象(步驟六)
答:1)?首先關閉記錄集;
????2)?其次關閉聲明;
????3)?最后關閉連接對象。
11.?數據表和類對應的三種關系:
答:1)?一個表對應一個類;
????2)?一個表對應相關類;
????3)?一個表對應整個類關系層
12.?類間關系的幾種表設計:
答:1)?多對一,
????2)?一對一:?
????3)?一對多:
????4)?多對多:
13.?SQL數據類型及其相應的Java數據類型
答:SQL數據類型?????????????????????Java數據類型??????????????說明
????------------------------------------------------------------------
????INTEGER或者INT??????????????????int?????????????????????通常是個32位整數
????SMALLINT????????????????????????short???????????????????通常是個16位整數
????NUMBER(m,n)?DECIMAL(m,n)????????Java.sql.Numeric????????合計位數是m的定點十進制數,小數后面有n位數
????DEC(m,n)????????????????????????Java.sql.Numeric????????合計位數是m的定點十進制數,小數后面有n位數
????FLOAT(n)????????????????????????double??????????????????運算精度為n位二進制數的浮點數
????REAL????????????????????????????float???????????????????通常是32位浮點數
????DOUBLE??????????????????????????double??????????????????通常是64位浮點數
????CHARACTER(n)或CHAR(n)???????????String??????????????????長度為n的固定長度字符串
????VARCHAR(n)??????????????????????String??????????????????最大長度為n的可變長度字符串
????BOOLEAN?????????????????????????boolean?????????????????布爾值
????DATE????????????????????????????Java.sql.Date???????????根據具體設備而實現的日歷日期
????TIME????????????????????????????Java.sql.Time???????????根據具體設備而實現的時戳
????TIMESTAMP???????????????????????Java.sql.Timestamp??????根據具體設備而實現的當日日期和時間
????BLOB????????????????????????????Java.sql.Blob???????????二進制大型對象
????CLOB????????????????????????????Java.sql.Clob???????????字符大型對象
????ARRAY???????????????????????????Java.sql.Array
????
2004-9-15?????星期三??????陰
1.?元數據
答:關于數據的信息,例如類型或者容量。通過JDBC?API可以訪問:
????1)?數據庫元數據;
???????a.?使用connection.getMetadata方法返回DataMetaData引用
???????b.?能夠使用isReadOnly此類方法獲取信息
????2)?結果集元數據;
???????a.?使用ResultSet.getMetadata方法返回ResultSetMetaData引用
???????b.?能夠使用getColumnCount此類方法獲取信息
2.?事務處理
答:1)?一系列的動作作為一個不可分的操作;
????2)?JDBC?API中使用事務處理步驟:
???????a.?用false作為參數調用setAutoCommit方法;
???????b.?執行一或多個關于數據庫的操作;
???????c.?調用commit方法完成改變;
???????d.?恢復上次提交后的改變,調用rollback方法.
???????try
???????{
??????????con.setAutoCommit(false);
??????????Statement?stm?=?con.createStatement();
??????????stm.executeUpdate("insert?into?student(name,?age,?gpa)?values('gzhu',?30,?4.8)");
??????????stm.commit();
???????}
???????catch(SQLException?e)
???????{
??????????try
??????????{
?????????????con.rollback();
??????????}
??????????catch(Exception?e)
??????????{
??????????}
???????}
3.?并發控制
答:1)?設置隔離級別方法:setTransactionIsolation
????2)?隔離級別靜態變量
???????a.?TRANSACTION_NONE:只讀的數據字典;
???????b.?TRANSACTION_READ_UNCOMMITTED:只讀未提交數據;
???????c.?TRANSACTION_READ_COMMITTED:只讀未提交數據;
???????d.?TRANSACTION_REPEATABLE_READ:重復讀取數據;
???????e.?TRANSACTION_SERIALIZABLE:無論做什么操作都不許別人動。
????3)?示例:con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
4.?JDBC?2.0?應用程序編程接口增強功能
答:1)?ResultSet增強:
???????a.?可以回卷;
???????b.?可以修改;
???????設置示例:Statement?stm?=?con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
????2)?Statement增強了批量修改能力(batch?updates);
????3)?更高級的數據類型(例:Struct)。
5.?JDBC?2.0標準擴展
答:1)?JNDI(Java?Naming?and?Directory?Interface):?解決離散狀態下Object的查找;
????2)?連接池:在內存中保存了一個數據庫連接,不需要注冊驅動器,提高性能的重要方法。