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