版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、JDBC學習筆記(該筆記由SD0601張亞玲提供)(我們所學習的均為jdbc2.0 規(guī)范,jdbcl.0為直接連接,而jdbc2.0 它有JNDI服務(wù),在服務(wù)器啟動時自動創(chuàng)建一個連接池,定義了一個DataSource 接口,用其標準才能使用JDBC連接池)一、關(guān)于JDBCl.連接到數(shù)據(jù)庫的方法答:1) ODBC(Open Database Connectivity) 一個以C語言為基礎(chǔ)訪問SQL為基礎(chǔ)數(shù)據(jù)庫引擎的接口,它提供了一致的接口用于 和數(shù)據(jù)庫溝通以及訪問數(shù)據(jù)。2) JDBC Java版本的ODBC2. JDBC 應(yīng)用編程接口答:JDBC應(yīng)用編程接口是:1) 標準的數(shù)據(jù)訪問接口,可以連到
2、不同的數(shù)據(jù)庫;2) JAVA編程語言的一組類和接口。JDBC應(yīng)用編程接口能夠:1) 連接到數(shù)據(jù)庫;2) 發(fā)SQL查詢字符串到數(shù)據(jù)庫;3) 處理結(jié)果。JDBC應(yīng)用編程接口有二個主要的部分:1) JAVA應(yīng)用程序開發(fā)接口面向 JAVA應(yīng)用程序開發(fā)者;2) JDBC驅(qū)動程序開發(fā)接口。3. JDBC Driver答:1) 一大堆實現(xiàn)了 JDBC類和接口的類;3) 提供了一個實現(xiàn)java.sql.Driver 接口的類。4. JDBC Driver 的四種類型 答:1) JDBC-ODBC 橋由ODBC驅(qū)動提供JDBC訪問,JDBCZ轉(zhuǎn)化為 ODBC 4) Native BridgeJava對數(shù)據(jù)庫的訪
3、問轉(zhuǎn)化為數(shù)據(jù)庫的客戶端對數(shù)據(jù)庫的訪問,所以需要安裝數(shù)據(jù)庫的客 戶端(API )。5) pure java直接發(fā)送到數(shù)據(jù)庫被數(shù)據(jù)庫監(jiān)聽。純的Java driver ,將JDBC調(diào)用轉(zhuǎn)入DBMS,與網(wǎng)絡(luò)協(xié)議無關(guān)。然后通過服務(wù)器將調(diào)用轉(zhuǎn)為DBMS協(xié)議。6) 本地協(xié)議純的java driver ,將JDBC調(diào)用直接轉(zhuǎn)為 DBMS使用的網(wǎng)絡(luò)協(xié)議5. JDBC 開發(fā)者接口答:1) java.sql-java 2平臺下JDBC的主要功能,標準版 (J2SE)7) javax.sql-java 2平臺下JDBC增強功能,企業(yè)版(J2EE)6.使用URL確認數(shù)據(jù)庫正確的主機,正確的協(xié)議,正確的協(xié)議,答:我們使用
4、 URL來確定一個數(shù)據(jù)庫(正確的Driver, 正確的用戶名和密碼);語法:protocol:subprotocol:subname范例:jdbc:db2:MyTestjdbc:db2:/localhost:6789/MyTestoracle馬區(qū)動:oracle.jdbc.driver.OracleDriverURL: jdbc:oracle:thin:<machine_name><:port>:dbname注:machine_name :數(shù)據(jù)庫所在的機器的名稱;(或 IP )port :端口號,默認是 1521mysql馬區(qū)動:org.gjt.mm.mysql.Dri
5、verURL: jdbc:mysql:<machine_name><:port>/dbname注:machine_name :數(shù)據(jù)庫所在的機器的名稱;(或 IP )port :端口號,默認 3306pointbase -馬區(qū)動:com.pointbase.jdbc.jdbcUniversalDriverURL: jdbc:pointbase:server:<machine_name><:port>/dbname注:machine_name :數(shù)據(jù)庫所在的機器的名稱;(或 IP ) port :端口號,默認是 9092SQL Server -馬區(qū)動
6、:com.microsoft.jdbc.sqlserver.SQLServerDriver URL:jdbc:microsoft:sqlserver:<machine_name><:port>DatabaseName=<dbnam e> 注:machine_name :數(shù)據(jù)庫所在的機器的名稱;(或 IP )port :端口號,默認是 1433DB2馬區(qū)動:com.ibm.db2.jdbc.app.DB2DriverURL: jdbc:db2:<machine_name><:port>/dbname注:machine_name :數(shù)據(jù)庫
7、所在的機器的名稱;(或 IP )port :端口號,默認是 50007. javax.sql包JDBC2.0 的增強功能答:1)數(shù)據(jù)源接口 ;8) 連接池;9) 分布式交易;10)行集;二、基本的JDBC應(yīng)用1、創(chuàng)建一個基本的 JDBC應(yīng)用答:1) 步驟一:注冊一個driver;driver被用于連接到數(shù)據(jù)庫;JDBC應(yīng)用編程接口使用第一個能成功連接到給定URL的driver;在同一時間可以裝載多個driver注冊一個 driver的方法:使用類loader( 裝載;實例化;注冊入DriverManager) Class.forName("oracle.jdbc.driver.Ora
8、cleDriver");a. Class.forName("Com.ibm.db2.jdbc.app.DB2Driver");b. Class.forName("C.DB2Driver");c. Class.forName("Com.microsoft.jdbc.sqlServer.SQLServerDriv er);d. Class.forName("oracl.jdbc.driver.OracleDriver");e. Class.forName("sun.jdbc.odbc.JdbcOdbcDriv
9、er");義例化一個Drivera. Driver drv = new COM.cloudscape.core.RmiJdbcDriver();2)步驟二:建立一個到數(shù)據(jù)庫的連接;第一種方法:DriverManager 調(diào)用getConnection(urlString)方法,實際上調(diào)用的是driver 的 connect(urlString)方法;Connection con= DriverManager.getConnection("jdbc:oracle:thin:6:1521:tarenadb","tarena",
10、"tar ena");當一個driver肯定地對應(yīng)到一個數(shù)據(jù)庫URL, DriverManager建立一個連接;當沒有driver 匹配,返回null然后下一個driver 被檢驗;假如沒有建立連接,拋出一個 SQLExcepiton 異常第二種方法:調(diào)用 driver 的connect 方法。儻I建一個到指定Driver實例的直接調(diào)用;避免一般訪問的問題Driver drv = new COM.ibm.db2.jdbc.app.DB2Driver();/ Driver drv = new oracle.jdbc.dri;Connection con = null;try
11、con = drv.connect("jdbc:db2:MyTest",new Properties。)catch(SQLException e)3)步驟三:創(chuàng)建一個statement;Statement的三個接口 :f. Statement;g. PreparedStatement(繼承自 Statement);h. CallableStatement(繼承自 PreparedStatement);用方法 Connection.createStatement()得至U一個 Statement 對象PreparedStatement 對象用 ProparedStatemen
12、t 比 statement 更為高效;t承自 Statement;(IM 法: PreparedStatement pstm =connection.prepareStatement(sqlString);CallableStatement 對象通過CallableStatement調(diào)用數(shù)據(jù)庫中的存儲過程繼承自 PreparedStatement; CallableStatement cstm = connection.prepareCall("call return_student?,?");-cstm.setString(1,"8623034");c
13、stm.registerOutparameter(2, Types.REAL);cstm.execute();float gpa = cstm.getFloat(2);4)步驟四:執(zhí)行SQL語句;通過接口方法將 SQL語句傳輸至黑認的數(shù)據(jù)庫連接,返回結(jié)果可能是一個數(shù)據(jù)表,可 以通過 java.sql.ResultSet訪問。Statement的接口方法:a. executeQuery(sqlString):執(zhí)行給定的SQL聲明,返回一個結(jié)果集(ResultSet) 對象;ResultSet rs = stm.executeQuery("select name,gender,age,g
14、pa from "+TABLE_NAMEb. executeUpdate(sqlString):執(zhí)行給定的 SQL 聲明,可以是 INSERT、UPDATE或DELETE聲明,也可以是 SQL DDL 聲明;c. execute(sqlString):執(zhí)行給定的 SQL 聲明。5)步驟五:處理結(jié)果;Q使用結(jié)果集(ResultSet)對象的訪問方法獲取數(shù)據(jù);a. next(): 下一個記錄b. first():第一個記錄c. last():最后一個記錄d. previous。:上一個記錄while(rs.next()System.out.print("name: "
15、 + rs.getString(1);System.out.print("tgender:" + rs.getString(2);System.out.print("tage: " + rs.getInt(3);System.out.println("tgpa:" + rs.getFloat(4);1過字段名或索引取得數(shù)據(jù),rs.getString( 列名)或者rs.getString(歹U名數(shù)字)。結(jié)果集保持了一個指向了當前行的指針,初始化位置為第一個記錄前。6)步驟六:關(guān)閉 JDBC對象。首先關(guān)閉記錄集;其次關(guān)I聲明;最后關(guān)閉連接
16、對象。最經(jīng)典的關(guān)閉這三個對象的程序是:public void close(ResultSet rs,Statement stm,Connection con)if(rs!=null)tryrs.close();catch(Exception me)if(stm!=null)trystm.close()catch(Exception me)if(con!=null)trycon.close()catch(Exception me) 2.經(jīng)常使用的一些 JDBC URL答:1) JDBC-ODBC: jdbc:odbc:<DB>2) Oracle: jdbc:oracle:oci:&l
17、t;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.Statement 的類型:答:1) Statement接口 :用來封裝任意一條SQL語句,但僅僅PM于靜態(tài)的SQL命令。a,得到一個 Statement :Statement stm=con.createStat
18、ement();Statement stm=con.createStatement(int resultSetType,int resultSetConcurrency); /生成一個指定結(jié)果集類型的Statement其中第一個參數(shù):resultSetType可指定為下列三種形式之一:ResultSet.TYPE_FORWARD_ONLY /不可回卷,只能依次從前往后讀。ResultSet.TYPE_SCROLL_INSENSITIVE /可回卷,但對底層數(shù)據(jù)庫的修改不敏感。 ResultSet.TYPE_SCROLL_SENSITIVE /可回卷,并且對底層數(shù)據(jù)庫的修改敏感。 第二個參數(shù):r
19、esultSetConcurrency可指定為下列兩種形式之一:ResultSet.CONCUR_READ_ONLY /結(jié)果集只讀,不可更新。ResultSet.CONCUR_UPDATABLE /結(jié)果集可更新。注意:設(shè)置以上兩類參藪均需要數(shù)據(jù)庫的支持。b,得到執(zhí)行結(jié)果:ResultSet rs = stm.executeQuery("selectname,gender,age,gpa from student0506");(返回結(jié)果集)int i = stm.executeUpdate("insert into student0506values ("
20、tony","male",20,89)”);(返回改變的行數(shù))boolean b = stm.execute("drop table student0506");(返回是否執(zhí)行成功)2) PreparedStatement接口,Statement 的子接口:用來封裝一條帶參數(shù)的SQL語句,可以用 來代替參數(shù)。a、得至U一個 PreparedStatement :PreparedStatement pstm=con.prepareStatement("insert into student0506 values(?,?,?,?)&quo
21、t;);con.prepareStatement()方法同樣可以在后面給2個表示結(jié)果集類型的參數(shù),設(shè)置與上相同。b、設(shè)置SQL語句中白參數(shù),并執(zhí)行SQL語句:pstm.setString(1,"tony");pstm.setString(2,"male");pstm.setInt(3,20);pstm.setFloat(4,89.5f);pstm.executeUpdate();3) CallableStatement接口 , PreparedStatement的非SQL語句,常常用來執(zhí)行 SQL存儲過程(一系列的 列的工作)。的子接口,用來封裝被數(shù)據(jù)庫
22、支持 SQL命令組成的集合,用來完成一系a,得到一個 CallableStatement : CallableStatement cs=con.prepareCall(String sql) 如果sql帶參數(shù),就在新建時傳給它,不帶參數(shù) 例如:CallableStatement cstm=con.prepareCall(cstm.seString(1, " 8613034");cstm.registerOutParameter(2,Types.REAL);/?可用代替?!癱all return_student ” )調(diào)用外部參數(shù),存儲類型的REAL 型。cstm.execu
23、te();float gpa=cstm.getFloat(2);return_student(String str,float gpa)select gpa from Student where id=str4. Statement 接口的比較StatementPreparedStatementCallableStatement寫代碼位置客戶端客戶端服務(wù)器端(數(shù)據(jù)庫端生成)存代碼位置客戶端服務(wù)器端服務(wù)器端(在服務(wù)器端轉(zhuǎn)化)編寫代碼技術(shù)Java , SQL 操作Java , SQL 操作數(shù)據(jù)庫的程序語言,如 PL/SQL可配置性高第一次高,以后低低可移植性高假設(shè)支持PreparedStateme
24、nt 的話高傳輸效率低第一次低,以后高高5 .數(shù)據(jù)表和類對應(yīng)的三種關(guān)系:答:1)類映射成表;2)屬性映射成列;3)類與類之間的關(guān)系映射成表;4) 一個實例映射成一行。6 .類間關(guān)系的幾種表設(shè)計:答:1)為每個類創(chuàng)建一個表;最接近面向?qū)ο蟮乃枷耄夷苤С侄鄳B(tài),且維護容易,但是這需要很多時間去維護很 多表,花更多的時間去讀寫這個表,直接從一個表來得到一個記錄比較困難。2)為每個實體類創(chuàng)建一個表(抽象類則不);比較容易得到一個記錄,但是如果你改動了一個類,則必須改變這個表和這個類的子 類的表。3)為一張完整的類的層次結(jié)構(gòu)建一張表。支持多態(tài),且維護容易,比較容易直接從一個表來得到一個記錄。但是任何一個
25、類的修 改都會影響該表,且這個表會異常龐大等。7 . SQL 數(shù)據(jù)類型及其相應(yīng)的 Java數(shù)據(jù)類型答:SQL數(shù)據(jù)類型Java數(shù)據(jù)類型說明INTEGER或者INTint通常是個32位整數(shù)SMALLINTshort通常是個16位整數(shù)NUMBER(m,n) DECIMAL(m,n) Java.sql.Numeric合計位數(shù)是m的定點十進制數(shù),小數(shù)后面有n位數(shù)DEC(m,n)Java.sql.Numeric合計位數(shù)是m的定點十進制數(shù),小數(shù)后面有n位數(shù)FLOAT(n)double運算精度為n位二進制數(shù)的浮點數(shù)REALfloat通常是 32位浮點數(shù)DOUBLEdouble通常是 64位浮點數(shù)CHARACT
26、ER(n)或 CHAR(n) String長度為 n的固定長度字符串VARCHAR(n)String最大長度為n的可變長度字符串BOOLEANboolean布爾值DATEJava.sql.Date根據(jù)具體設(shè)備而實現(xiàn)的日歷日期TIMEJava.sql.Time根據(jù)具體設(shè)備而實現(xiàn)的時戳TIMESTAMPJava.sql.Timestamp根據(jù)具體設(shè)備而實現(xiàn)的當日日期和時間BLOBJava.sql.Blob二進制大型對象CLOBJava.sql.Clob字符大型對ARRAYJava.sql.Array三.JDBC的高級特性1. 元數(shù)據(jù)答:關(guān)于數(shù)據(jù)庫的一些信息,例如類型或者容量??梢酝ㄟ^JDBC AP
27、I訪問:1) 數(shù)據(jù)庫元數(shù)據(jù);a. 使用 connection.getMetadata方法得到 DataMetaData 對象,從而獲取關(guān)于數(shù)據(jù)庫的信息。b. 能夠使用DataMetaData.isReadOnly ()此類方法獲取關(guān)于數(shù)據(jù)庫信息。2)結(jié)果集元數(shù)據(jù);c. 使用 ResultSet.getMetadata方法返回 ResultSetMetaData 對象。d. 能夠使用getColumnCount此類方法獲取信息2.數(shù)據(jù)庫的事務(wù)處理答:1) 一系列的sql命令作為一個不可分的操作2) JDBC API中使用事務(wù)處理步驟:如果不需要則用false作為參數(shù)調(diào)用()方法;()方法完成改變
28、;Connection.rollback()方法,則從上一次a. 設(shè)置是否需要系統(tǒng)自動提交事務(wù)Connection.setAutoCommitb. 執(zhí)行一或多個sql命令;c. 調(diào)用 Cmitd. 恢復上次提交后的改變,調(diào)用提交開始回滾。例子如下:trycon.setAutoCommit(false);Statement stm = con.createStatement();stm.executeUpdate("insert into student(name, age, gpa) values('gzhu', 30, 4.8)");mit();catch
29、(SQLException e)trycon.rollback();catch(Exception e) 3.數(shù)據(jù)庫的并發(fā)控制答:1) 設(shè)置隔離級別方法:調(diào)用 Connection 對象的setTransactionIsolation() 方法。2)數(shù)據(jù)庫的隔離級別可以避免以下問題:莊讀(Dirty reads ) : A去修改數(shù)據(jù)庫,沒有提交,B去訪問,發(fā)現(xiàn)數(shù)據(jù)是 A訪問之前的數(shù)據(jù),叫臟讀。可重復讀(Non-repeatable reads ) : A始終不停的去讀數(shù)據(jù),他認為他對數(shù)據(jù)庫是獨占的,這時 B去修改數(shù)據(jù)庫,A發(fā)現(xiàn)數(shù)據(jù)庫更改了,叫不可重復讀。0象t賣(Plantom reads )
30、 : A修改了數(shù)據(jù)庫,同時 B也修改,對于 A來說,最 終數(shù)據(jù)不是他預期的,對他來說產(chǎn)生了幻象。發(fā)生這三種情況的最主要原因都是在同一時間,有多個線程對同一數(shù)據(jù)庫進行了操作,所以我們要在效率和安全之間找一個平衡點。3)隔離級別靜態(tài)變量a. TRANSACTION_NONE :不支持事務(wù)(三種都有可能發(fā)生);b. TRANSACTION_READ_UNCOMMITTED :允許未提交前讀數(shù)據(jù)(最彳氐級另;c. TRANSACTION_READ_COMMITTED :只允許提交后讀數(shù)據(jù)(避免臟讀);d. TRANSACTION_REPEATABLE_READ :支持可重復讀取數(shù)據(jù)(避免臟讀和不可重復
31、讀);e. TRANSACTION_SERIALIZABLE :序列化讀(最嚴格的級別,即每一個事務(wù)都 必須排序等待)。3)不例:con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);con.getTransactionIsolation()可以得到當前連接數(shù)據(jù)庫的隔離級別。四、JDBC2.0核心特性1. JDBC 2.0應(yīng)用程序編程接口增強功能答:1) ResultSet 增強:a.可以回卷;傳統(tǒng)的遍歷一個 ResultSet ,只可能一步一步的 next ,游標永遠指向當前,叫不可回卷。 而新增的功能游標可
32、以向前向后移動,并且可以給定一個絕對和相對位置。b. 可以修改,即修改 ResuleSet支持);設(shè)置示例:stm = con.createStatementResultSetConcurrency);con.prePareStatementResultSetConcurrency);con. prePareCall (sqlResultSetConcurrency);ResultSetType :結(jié)果集類型(可否回卷)ResultSet.TYPE_FORWARD_ONLY;(ResultSet.TYPE_SCROLL_INSESITIVE ;的再一次修改不敏感)ResultSet.TYPE_
33、SCROLL_SESITIVE,可以直接修改到底層數(shù)據(jù)庫(需要底層數(shù)據(jù)庫(int ResultSetType,int(sql , int ResultSetType,int,int ResultSetType,int,包括不可回卷)(可回卷,但對底層數(shù)據(jù)庫(可回卷且敏感)ResultSetConcurrency :并發(fā)條件,是否可以修改到底層數(shù)據(jù)庫。包括:ResultSet.CONCUR-READ-ONLY;(不可更新)ResultSet.CONCUR-UPDATEABLE (可更新)需要創(chuàng)建一個可更新的resultset ,需要做以下操作:第一,指定 createStatement 的參數(shù)第
34、二,sql語句必須返回一個可更新的結(jié)果集 返回可更新的結(jié)果集,可使用下面兩種方法:select t.*, t.rowid from t_user t select * from t_user for update例如:rs.updateStringrs.updateFloatrs.updateRowrs.absolute(10)(1 ,“9113016 );(“gpa",4.8 );/ 一定要做這條語句,否則不會提交到數(shù)據(jù)庫/光標移到要刪除的這一行rs.delectRow();/ rs.movetolnsertRowrs.updateString rs.updateFloatrs.i
35、nsertRow ()刪除行();插入的行(1 , “9113016 );(“gpa",4.8 );上述更新中是有限制的,包括:只能引用一張表,不能引用到多個表;含能包含任何連接操作(子查詢或自連接);口必須要把主鍵查出來0必須要把有非空約束且沒有默認值的列查出來。CONCUR_READ_ONLY (默認)此常量表明該結(jié)果集是只讀的CONCUR_UPDATABLEcommit )表明結(jié)果集可進行更新(指用戶自己對該結(jié)果集進行更新,并將更新的結(jié)果自動TYPE_FORWARD_ONLY (默認)指結(jié)桌集只能進行前向滾動操作,即只能調(diào)用next() 方法TYPE_SCROLL_INSENS
36、ITIVE結(jié)果厘而以進行前向或者后向的滾動,并可進行absolute。等定位操作該結(jié)果集對于其它用戶修改不敏感當A用戶使用指定了 TYPE_SCROLL_INSENSITIVE的結(jié)果集取得結(jié)果后。有其它用戶修改了該查詢條件的結(jié)果集,此時,A用戶的結(jié)果集在進行各種操作時,仍然使用第一次查詢得到的結(jié)果集。TYPE_SCROLL_SENSITIVE結(jié)果藁)以進行前向或者后向的滾動,并可進行absolute。等定位操作該結(jié)果集對于其它用戶修改敏感當A用戶使用指定了 TYPE_SCROLL_SENSITIVE 的結(jié)果集取得結(jié)果后。有其它用戶修改了 該查詢條件的表的數(shù)據(jù),此時, A用戶的結(jié)果集在進行各種操
37、作時,會將自己的結(jié)果集與數(shù)據(jù) 庫中的數(shù)據(jù)進行同步,然后再顯示。HOLD_CURSORS_OVER_COMMIT (默認)在commit動作后,仍然葆持數(shù)據(jù)庫的連接CLOSE_CURSORS_AT_COMMIT在一個commit動作后,關(guān)閉數(shù)據(jù)庫連接/以下三種常量很少使用,了解即可FETCH_FORWARD結(jié)果集只能前向操作(從第一行到最后一行)FETCH_REVERSE結(jié)果集只能后向操作(從最后一行到第一行)FETCH_UNKNOWN 結(jié)果集操作方式未知2) Statement增強了 批量修改能力 (batch updates);很多的sql群命令,可以一次執(zhí)行,如下應(yīng)用實例:Statemen
38、t stm=con.createStatement();Stm.addBatch( "insert into student(name,age,gpa) values('gzu' ,30,4.9) " );/ 要用 addBatch 來添加 sql 命令。Stm.addBatch( "inser t into student(name,age,gpa) values ('wang' ,40,4.5) ”);int 口results=st.executeBatch();一定要用該語句來執(zhí)行mit();如果有一條出錯,則全部回滾。3)更
39、高級的數(shù)據(jù)類型(例:Blob,Clob,Array等,這些都是SQL支持的數(shù)據(jù)類型)。BLOB :大的二進制數(shù)據(jù)CLOB:大的文本對象Array :數(shù)組類型blob clob 從數(shù)據(jù)庫的存取寫入數(shù)據(jù)庫:1) .插入空BLOB字段值:"insert into tbl_blob(id,fileName,blobData)values(?,?,empty_blob()"2) .獲取空BLOB字段值:"select blobData from tbl_blob where fileName= ? for update"3) .構(gòu)造文件輸入流,從空BLOB對象獲取
40、二進制輸出流,并將文件內(nèi)容寫入OutputStream out =blob.getBinaryOutputStream();4) .更新記錄,將BLOB對象寫入oracle 數(shù)據(jù)庫update tbl_blob set blobData=? where fileName=?pstmt.setBlob(1,blob);pstmt.setString(2,args0);pstmt.executeUpdate();從數(shù)據(jù)庫中讀出:1) "SELECT blobData " +"FROM tbl_blob " +"WHERE fileName = ?&
41、quot;2) Blob b = rs.getBlob(1);3) InputStream in=b.getBinaryStream();6,JDBC 2.0 標準擴展(JNDI服務(wù)需要第三方類庫的支持 )答:1) JNDI(Java Naming and Directory Interface):解決離散狀態(tài)下 Object的查找,相當于一系列的鍵值對,為每一個 DataSource 起一個名字;4) DataSource:封裝在應(yīng)用程序中可用到的一條數(shù)據(jù)資源對象,需 JNDI的支持。5) ConnectionPool :在內(nèi)存中保存了多條連接,應(yīng)用程序可重復利用這些連接, 提高性能的重要方
42、法。應(yīng)用實例:Context cyx=new InitialContext();/InitialContext()借口的實現(xiàn)類,是一個具體的中間件廠商提供的,如果我們要使用 JNDI服務(wù)的話,要安裝中間件。(如 tomcat )DataSource ds=(DataSource)ctx.lookup( "jdbc/my_oracle ");Connection con=ds.getConnection(userid,userpasswd可以不用);8,RowSet( 對rowset的操作需要第三方類庫的支持)RowSet是默認支持更新和回滾的ResultSet 。它是一個接
43、口,一共有五個子接口。1) 查詢a. Register jdbc driversb. Create database connection through DriverManagerc. Prepare statementd. Execute statemente. = 填充 RowSet =CachedRowSetImpl crs=null;crs = new CachedRowSetImpl();crs.populate(rs);f. handle resultwhile(crs.next()System.out.print("id:" + crs.getString(
44、1);System.out.print("tname: " + crs.getString(2);2)更新g. Register jdbc driversh. =Create database connection & execute sql= crs = new CachedRowSetImpl();crs.setUrl(args1);crs.setUsername(args2);crs.setPassword(args3);crs.setCommand("select * from tbl_user"); crs.execute();i. =
45、更新操作= crs.moveToInsertRow();? crs.updateInt("id", 10098347);crs.updateString("name", "Shakespeare");crs.updateString("password","pass");crs.insertRow();/?crs.moveToCurrentRow();/ crs.acceptChanges();/ d. = handle result= while(crs.next() System.out.p
46、rint("id:" + crs.getString(l);System.out.print("tname:" + crs.getString(2);System.out.println(""); 在jdk1.4 的javax.sql包中有一個 RowSet接口,但是沒有具體實現(xiàn)的類。jdk1.5 誕生之后,引入了 javax.sql.rowset包中的五個子接口和com.sun.rowset包里面的對應(yīng)的五個實現(xiàn)類,jdk1.5 中RowSet的五個子接口分別是 JdbcRowSet,CachedRowSet,WebRowSet,J
47、oinRowSet和 FilteredRowSet 。RowSet對象可分為兩類:有連接的和無連接的。JdbcRowSet 是唯個有連接的實現(xiàn),和傳統(tǒng)的ResultSet一個樣,有連接的實現(xiàn)是基于Jdbc驅(qū)動的連接,數(shù)據(jù)庫的連接是貫穿整個對數(shù)據(jù)庫的操作。而無連接的實現(xiàn)是基于 Reader和Writer 流的連接,在需要讀取數(shù) 據(jù)和寫入數(shù)據(jù)的時候才建立連接,在整個操作過程中都是斷開連接的,后面四個接口對象都是 無連接的實現(xiàn)。JdbcRowSet 接口:這個接口基本上和 ResultSet有類似的功能,只不過它的結(jié)果集默認是ResultSet.TYPE_SCROLL_INSENSITIVE 和 R
48、esultSet.CONCUR_UPDATABLE 的,也 就是說默認的結(jié)房集就是可以上下滾動和可更新的。因為本身RowSet接口就是ResultSet的子接口,所以1.5里面的所有 RowSet者B有ResultSet的方法,而JdbcRowSet又只是在默認的屬性和ResultSet有區(qū)別,所以它對結(jié)果集的操作方法和ResultSet 都是一樣的。JdbcRowSet的創(chuàng)建方法有兩種,一種是基于傳統(tǒng)的JDBC連接數(shù)據(jù)庫的方法:Class .forName( "org.gjt.mm.mysql.Driver "); Connection con=DriverManager
49、.getConnection("jdbc:mydql:localhost:3306/test","root ', " " );Statement stm=con.createStatement();ResultSet rs=stamt.executeQuery( "select * from tablei ");JdbcRowSet jrs=new JdbcRowSetlmpl(rs);這樣就創(chuàng)建了一個對象(JdbcRowSetlmpl 是com.sun.rowset包里面的實現(xiàn)類,文中的五個接口在包中都對應(yīng)有一個實
50、現(xiàn)類),這個對象里面的數(shù)據(jù)就是和rs里面的數(shù)據(jù)是一樣的。還有一種創(chuàng)建的方法是使用默認的構(gòu)造方法,然后 set屬性得到數(shù)據(jù),個人推薦使用第二種JdbcRowSet jrs=new JdbcRowSetImpl();jrs.setUrl("jdbc:mydql:localhost:3306/test");jrs.setUsername( "root ");jrs .setPassword( "");jrs.setCommand( "select * from tablel ");jrs.execute();這樣創(chuàng)建的對
51、象是和第一種方法是一樣的結(jié)果。當然這種方法可以連接一個數(shù)據(jù)源,如果我們 在上下文環(huán)境種綁定了一個數(shù)據(jù)源,JNDI名字是dataSource1 ,那么下面的代碼就可以獲得對象: JdbcRowSet jrs=new JdbcRowSetImpl();jrs.setDataSourceName( "dataSource1 ”)jrs.setcommand() jrs.execute();得到對象之后我們就可以使用相應(yīng)的方法來對數(shù)據(jù)進行遍歷,更新,插入或者刪除。我有2點要說明:第一,其它四個接口的對象中除了JoinRowSet創(chuàng)建方式基本都是一樣的,只是接口名字和接口實現(xiàn)類的名字不同而已;
52、第二,雖然JdbcRowSet默認是可滾動和可更新的,但是這也是需要數(shù)據(jù)庫驅(qū)動支持的CachedRowSet 接口:它繼承于RowSet接口,而且他是無連接的RowSet的其他3個實現(xiàn)的父接口,也就是說其他3個接口都直接或者間接繼承了它。從名字我們可以知道,它的原理就是讀入數(shù)據(jù)保存在 緩存進行相應(yīng)的操作。創(chuàng)建接口對象除了上面的兩種創(chuàng)建方式,還有一個方法,就是在構(gòu)造方法里面?zhèn)鬟f一個SyncProvider 。無連接的RowSet都是基于流讀寫的,SyncProvider就是提供了特定的Reader 和 Writer 。jdk1.5 文檔的Sample Coder有這樣的實現(xiàn):String pro
53、vider= "viders.HighAvailabilityProvider”CachedRowSet crs=new CachedRowSetImpl(provider);這樣我們就為 RowSet設(shè)置了特定的 Reader和Writer ,但是這是需要第三方的包支持的。 而我們使用無參的構(gòu)造方法創(chuàng)建的對象是使用了默認的SyncProvider ,當然一般來說這對于我們就已經(jīng)足夠了。創(chuàng)建了對象之后就可以使用和JdbcRowSet 一樣的方法來進行就結(jié)果集的增刪改操作了,但是唯一不同的就是在更新了結(jié)果集之后必須調(diào)用Writer將緩存中的數(shù)據(jù)寫入數(shù)據(jù)庫,而其方
54、法就是crs.acceptChages();CachedRowSet 提供的最令人興奮的功能就是分頁功能。請看下面的代碼: CachedRowSet crs=new CaehedRowSetImpl();crs.setUrl("jdbc:mydql:localhost:3306/test");crs.setUsername( "root ");crs.setPassword( "");crs.setCommand( "select * from tablel ");crs.setPageSize(5)/每一頁有 5
55、 條記錄;crs.execute();while(crs.nextPage()/先翻頁再瀏覽while(crs.next()System.out.println(crs.getInt("id" +"t" +crs.getString("name');我們在crs.execute()之前設(shè)置每頁的數(shù)據(jù)行數(shù),那么 Reader讀取數(shù)據(jù)的時候就只讀指定的行數(shù)的數(shù)據(jù),這樣我們就避免了一次讀取所有數(shù)據(jù)再進行分頁操作。是不是很簡單呢JoinRowSet 接口:這個接口可以提供我們在無連接的狀態(tài)下直接對結(jié)果集進行Join。下面的代碼提供了JoinRowSet的實現(xiàn):CachedRowSet crs1=new CaehedRowSetImpl(); crs1.setUrl( "jdbc:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度停車場消防安全管理與應(yīng)急預案合同4篇
- mcn簽約合同范本
- 科技產(chǎn)品的品牌建設(shè)與傳播策略
- 教育資源優(yōu)化配置在學生健康促進中的作用
- 2025版醫(yī)療設(shè)備銷售合同協(xié)議書與結(jié)算單
- 教育信息化背景下的辦公環(huán)境中的勞動教育案例
- 2025版畜禽養(yǎng)殖場土地承包與農(nóng)業(yè)物聯(lián)網(wǎng)技術(shù)應(yīng)用合同3篇
- 2025年度風力發(fā)電機租賃與運營管理合同范本3篇
- 個人向公司2024年短期借款合同
- 專賣店員工聘用協(xié)議范本2024年版版A版
- 油氣行業(yè)人才需求預測-洞察分析
- 《數(shù)據(jù)采集技術(shù)》課件-Scrapy 框架的基本操作
- 高一化學《活潑的金屬單質(zhì)-鈉》分層練習含答案解析
- 華為集團干部管理
- 圖書館前臺接待工作總結(jié)
- 衛(wèi)生院藥品管理制度
- 理論力學智慧樹知到期末考試答案章節(jié)答案2024年中國石油大學(華東)
- 2024老年人靜脈血栓栓塞癥防治中國專家共識(完整版)
- 四年級上冊脫式計算100題及答案
- 上海市12校2023-2024學年高考生物一模試卷含解析
- 儲能電站火災應(yīng)急預案演練
評論
0/150
提交評論