国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

ORACLE自帶的JDBC源代碼解析

2024-08-29 13:31:31
字體:
供稿:網(wǎng)友


        大凡使用過jdbc連oracle的人都會(huì)知道這樣一個(gè)事實(shí):我們需要的庫文件classes12.zip存在于$oracle_home/jdbc/lib目錄下(但仍有部分菜鳥每每在論壇上求此庫文件,真是辛苦);但很少有人知道oracle還為我們準(zhǔn)備了使用jdbc的示例,它存在于 $oracle_home/jdbc/demo/demo.zip 中。
        前一段時(shí)間,我學(xué)習(xí)oracle的oop技術(shù),很受觸動(dòng)。當(dāng)時(shí)我想:jdbc中一定存在某些oo技術(shù)以支持它。很久都沒有找到合適的例子,最后在oracle的安裝目錄下找到它。真可謂是:踏破鐵鞋無覓處,得來全不費(fèi)工夫。

        約定:
        1、如果出現(xiàn) java.lang.unsatisfiedlinkerror: do_open,則你需要把 drivermanager.getconnection() 方法的 url 修改成 jdbc:oracle:thin:@127.0.0.1:1521:oradb,具體原因未知;
        2、如果出現(xiàn) java.sql.sqlexception: 不支持的字符集: oracle-character-set-852,則你需要把 nls_charset12.zip加入你的工程中(此文件與 classes12.zip 同目錄);

        下面我就把文件夾 amples/oci8/object-samples下的文件做一個(gè)詳細(xì)的功能描述:
        1、personobject.java
        這個(gè)例子演示了表 people 中存在adt字段 empid,其類型為 person,而且類型 person中存在adt字段 home,其類型為 address,而且類型 address是一個(gè)adt。
        如果使用常規(guī)sql語句,其插入語句與在sql/plus中無異,即:使用構(gòu)造函數(shù)嵌套構(gòu)造。
        另有一種方法,使用 struct 的構(gòu)造函數(shù) struct(structdescriptor, connection, object[]) 構(gòu)造出一個(gè)struct對(duì)象,即一個(gè)adt對(duì)象。同時(shí),如果有嵌套則需要嵌套構(gòu)造adt對(duì)象。最后通過 preparedstatement的 setobject方法指定adt對(duì)象即可。
        讀取數(shù)據(jù)時(shí)則采用與上述方法相逆的辦法:如果是簡(jiǎn)單類型,則直接讀取;如果是adt,則使用resultset的getobject(),再?gòu)?qiáng)制轉(zhuǎn)換成struct,然后調(diào)用struct的getattributes()方法取得 object[] 類型數(shù)據(jù),如是遞歸。

        2、sqldataexample.java與employeeobj.java
        此例與1中相似,也是對(duì)adt的處理,不同的是類型沒有嵌套。
        比較而言,2比1的代碼簡(jiǎn)潔了很多,不過也是付出了代價(jià):為類型 employee 抽象出一個(gè)類employeeobj,它實(shí)現(xiàn)了sqldata接口,并重寫了三個(gè)方法(必須的)。
        前臺(tái)的調(diào)用比1中的第二種方法簡(jiǎn)潔了很多,只需要直接使用preparedstatement的 setobject方法指定adt對(duì)象即可(不過需要指定其類型為oracletypes.struct)。讀取時(shí)也可直接使用oracleresultset的getobject()并強(qiáng)制轉(zhuǎn)換成employeeobj對(duì)象即可。
        真可謂是:有得必有失!!
        另,此例中有幾處需要注意的地方:
        2.1 employeeobj.java中的 import oracle.jdbc2.*; 改成 import oracle.jdbc.*; 原因未知;
        2.2 sqldataexample.java 中的 dictionary map = conn.gettypemap(); 改成 java.util.map map = conn.gettypemap(); 原因:note:  this class(指的是dictionary) is obsolete. new implementations should implement the map interface, rather than extendidng this class.(來源:javadoc);
        2.3 sqldataexample.java 中的 pstmt.executequery(); 改成 pstmt.executeupdate(); 更合理些,因?yàn)檫@是更新而非查詢(不改也不會(huì)影響功能,只是建議);

        3、customdatumexample.java與employee.java
        此例與2完全相同。不同的是采用了另外一種抽象技術(shù),并實(shí)現(xiàn)了接口customdatum 與 customdatumfactory,并重寫了二個(gè)方法todatum()與create()。在前臺(tái)訪問數(shù)據(jù)時(shí)亦有少許不同:采用了oracleresultset的getcustomdatum()方法并把它強(qiáng)制轉(zhuǎn)換成employee。從外觀上看,2中sqldata接口存在于 java.sql.* 包中;而接口customdatum 與 customdatumfactory則存在于oracle.sql.*包中,可以認(rèn)為是oracle公司對(duì)自己產(chǎn)品的專門實(shí)現(xiàn)。或許有更高的性能、更小的開銷?不過3不如2來得直接,個(gè)人認(rèn)為。

        4、arrayexample.java
        從文件名可看出,此示例演示的是varray類型。
        同1,插入亦有兩種方法。一種可直接使用sql;另外,可使用oraclepreparedstatement的setarray方法,構(gòu)造array的過程與構(gòu)造 struct 無異。數(shù)據(jù)的讀取過程與此相反:先使用oracleresultset的getarray()方法取得array對(duì)象,再調(diào)用此對(duì)象的getarray()方法并強(qiáng)制轉(zhuǎn)換成對(duì)象數(shù)組,然后對(duì)此數(shù)組操作即可。

        5、personref.java與studentref.java
        不知是不是oracle與我們開玩笑,這兩個(gè)文件除了類名不同外,其余一切相同。
        這個(gè)例子給我們演示的是對(duì)象表的概念。對(duì)象表的插入與普通表沒有任何不同,數(shù)據(jù)的讀取首先體現(xiàn)在其sql上,需要使用ref函數(shù),然后調(diào)用resultset的getobject()方法并強(qiáng)制轉(zhuǎn)換成ref對(duì)象,再利用此對(duì)象的getvalue()并轉(zhuǎn)換成struct對(duì)象,再利用此對(duì)象 的getattributes()方法得到object[],然后對(duì)此數(shù)組操作即可。

        6、refclient.java與genref.java
        this sample demonstrates using ref over two different sessions.
        類genref用來封裝ref對(duì)象所指向的類型及其二進(jìn)制內(nèi)容。程序先materialize into genref,然后在另一會(huì)話中de-materialize ref from genref,下面就與處理ref相同:利用此對(duì)象的getvalue()并轉(zhuǎn)換成struct對(duì)象,再利用此對(duì)象 的getattributes()方法得到object[],然后對(duì)此數(shù)組操作即可。

        7、fileexample.java與plsql_fileexample.java
        此示例使用 bfile 數(shù)據(jù)類型,contains a locator(定位器) to a large binary file stored outside the database。數(shù)據(jù)插入時(shí)需要使用函數(shù) bfilename,這個(gè)函數(shù)需要目錄對(duì)象,此對(duì)象需要使用create directory mydir來創(chuàng)建(此用戶需具有create any directory系統(tǒng)權(quán)限)。我曾在這個(gè)地方有個(gè)大教訓(xùn):按著步驟做,可在讀取時(shí)總是提示我沒有此目錄!!最后,我把bfilename函數(shù)的第一個(gè)參數(shù)(即目錄名)大寫就好了。原因:目錄名在函數(shù)中區(qū)分大小寫,雖然我們創(chuàng)建它時(shí)用的是小寫,可到了數(shù)據(jù)庫中后就自動(dòng)變成了大寫。
        讀取bfile類型的數(shù)據(jù)時(shí),首先通過其getbinarystream()方法得到二進(jìn)制的輸入流,然后操作這個(gè)輸入流就可以了。the limitation is your imagination。
        plsql_fileexample.java實(shí)現(xiàn)的功能與上述的相同,只不過所有針對(duì)bfile的操作都是通過調(diào)用pl/sql匿名塊來完成的,并使用了oraclecallablestatement。如果沒有必要,使用前者即可。

        8、lobexample.java與plsql_lobexample.java
        此示例使用了clob和blob數(shù)據(jù)類型。
        插入數(shù)據(jù)時(shí),需要分別通過getbinaryoutputstream()和getcharacteroutputstream()得到二進(jìn)制輸出流和字符輸出流,然后就是針對(duì)此輸出流的操作了,與傳統(tǒng)的 java i/o 相同。
        讀取數(shù)據(jù)時(shí),需要分別通過getbinarystream()和getcharacterstream()得到二進(jìn)制輸入流和字符輸入流,然后就是針對(duì)此輸入流的操作了,與傳統(tǒng)的 java i/o 相同。
        plsql_lobexample.java實(shí)現(xiàn)的功能與上述的相同,只不過所有針對(duì)clob和blob的操作都是通過調(diào)用pl/sql匿名塊來完成的,并使用了oraclecallablestatement。如果沒有必要,使用前者即可。
    
        注:7、8的第二個(gè)示例中均使用到了dbms_lob程序包。

        上面我僅對(duì)oracle給我們提供的demo的極小的一部分給出了解釋,并加入我自己的看法。我也是想通過這篇文章,起到拋磚引玉的作用,希望廣大網(wǎng)友多對(duì)產(chǎn)品的示例進(jìn)行分析,從而得到最原汁原味的代碼。

        你的意見,我愿意聽!! email:[email protected]
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 霍州市| 莆田市| 麻江县| 湖南省| 宜城市| 广东省| 桐城市| 阿拉善右旗| 保德县| 安塞县| 江川县| 沁源县| 靖州| 措美县| 营山县| 铜梁县| 江永县| 越西县| 昆明市| 白朗县| 定远县| 元江| 盐边县| 尚义县| 毕节市| 二手房| 兴隆县| 华坪县| 鄯善县| 八宿县| 天祝| 天柱县| 都江堰市| 东源县| 莱西市| 福鼎市| 基隆市| 大庆市| 北安市| 大庆市| 文水县|