电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

ORACLE自帶的JDBC源代碼解析

瀏覽:4日期:2024-07-06 15:41:56
大凡使用過JDBC連Oracle的人都會知道這樣一個事實:我們需要的庫文件classes12.zip存在于$ORACLE_HOME/jdbc/lib目錄下(但仍有部分菜鳥每每在論壇上求此庫文件, 真是辛勞);但很少有人知道ORACLE還為我們預(yù)備了使用jdbc的示例,它存在于 $ORACLE_HOME/jdbc/demo/demo.zip 中。 前一段時間,我學(xué)習(xí)ORACLE的OOP技術(shù),很受觸動。當(dāng)時我想: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 同目錄); 下面我就把文件夾 amplesoci8object-samples下的文件做一個具體的功能描述: 1、PersonObject.java 這個例子演示了表 people 中存在ADT字段 empid,其類型為 PERSON,而且類型 PERSON中存在ADT字段 home,其類型為 ADDRESS,而且類型 ADDRESS是一個ADT。 假如使用常規(guī)SQL語句,其插入語句與在sql/plus中無異,即:使用構(gòu)造函數(shù)嵌套構(gòu)造。 另有一種方法,使用 STRUCT 的構(gòu)造函數(shù) STRUCT(StructDescriptor, Connection, Object[]) 構(gòu)造出一個STRUCT對象,即一個ADT對象。同時,假如有嵌套則需要嵌套構(gòu)造ADT對象。最后通過 PreparedStatement的 setObject方法指定ADT對象即可。 讀取數(shù)據(jù)時則采用與上述方法相逆的辦法:假如是簡單類型,則直接讀??;假如是ADT,則使用ResultSet的getObject(),再強(qiáng)制轉(zhuǎn)換成STRUCT,然后調(diào)用STRUCT的getAttributes()方法取得 Object[] 類型數(shù)據(jù),如是遞歸。 2、SQLDataExample.java與EmployeeObj.java 此例與1中相似,也是對ADT的處理,不同的是類型沒有嵌套。 比較而言,2比1的代碼簡潔了很多,不過也是付出了代價:為類型 EMPLOYEE 抽象出一個類EmployeeObj,它實現(xiàn)了SQLData接口,并重寫了三個方法(必須的)。 前臺的調(diào)用比1中的第二種方法簡潔了很多,只需要直接使用PreparedStatement的 setObject方法指定ADT對象即可(不過需要指定其類型為OracleTypes.STRUCT)。讀取時也可直接使用OracleResultSet的getObject()并強(qiáng)制轉(zhuǎn)換成EmployeeObj對象即可。 真可謂是:有得必有失!! 另,此例中有幾處需要注重的地方: 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(); 更合理些,因為這是更新而非查詢(不改也不會影響功能,只是建議); 3、CustomDatumExample.java與Employee.java 此例與2完全相同。 不同的是采用了另外一種抽象技術(shù),并實現(xiàn)了接口CustomDatum 與 CustomDatumFactory,并重寫了二個方法toDatum()與create()。在前臺訪問數(shù)據(jù)時亦有少許不同:采用了OracleResultSet的getCustomDatum()方法并把它強(qiáng)制轉(zhuǎn)換成Employee。從外觀上看,2中SQLData接口存在于 java.sql.* 包中;而接口CustomDatum 與 CustomDatumFactory則存在于oracle.sql.*包中,可以認(rèn)為是Oracle公司對自己產(chǎn)品的專門實現(xiàn)?;蛟S有更高的性能、更小的開銷?不過3不如2來得直接,個人認(rèn)為。 4、ArrayExample.java 從文件名可看出,此示例演示的是VARRAY類型。 同1,插入亦有兩種方法。一種可直接使用SQL;另外,可使用OraclePreparedStatement的setARRAY方法,構(gòu)造ARRAY的過程與構(gòu)造 STRUCT 無異。數(shù)據(jù)的讀取過程與此相反:先使用OracleResultSet的getARRAY()方法取得ARRAY對象,再調(diào)用此對象的getArray()方法并強(qiáng)制轉(zhuǎn)換成對象數(shù)組,然后對此數(shù)組操作即可。 5、PersonRef.java與StudentRef.java 不知是不是ORACLE與我們開玩笑,這兩個文件除了類名不同外,其余一切相同。 這個例子給我們演示的是對象表的概念。對象表的插入與普通表沒有任何不同,數(shù)據(jù)的讀取首先體現(xiàn)在其SQL上,需要使用REF函數(shù),然后調(diào)用ResultSet的getObject()方法并強(qiáng)制轉(zhuǎn)換成REF對象,再利用此對象的getValue()并轉(zhuǎn)換成STRUCT對象,再利用此對象 的getAttributes()方法得到Object[],然后對此數(shù)組操作即可。 6、RefClient.java與GenREF.java This sample demonstrates using REF over two different Sessions. 類GenREF用來封裝REF對象所指向的類型及其二進(jìn)制內(nèi)容。程序先Materialize into GenREF,然后在另一會話中De-materialize REF from GenREF,下面就與處理REF相同:利用此對象的getValue()并轉(zhuǎn)換成STRUCT對象,再利用此對象 的getAttributes()方法得到Object[],然后對此數(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ù) bfilename,這個函數(shù)需要目錄對象,此對象需要使用create Directory mydir來創(chuàng)建(此用戶需具有CREATE ANY DIRECTORY系統(tǒng)權(quán)限)。我曾在這個地方有個大教訓(xùn):按著步驟做,可在讀取時總是提示我沒有此目錄!!最后,我把BFILENAME函數(shù)的第一個參數(shù)(即目錄名)大寫就好了。原因:目錄名在函數(shù)中區(qū)分大小寫,雖然我們創(chuàng)建它時用的是小寫,可到了數(shù)據(jù)庫中后就自動變成了大寫。 讀取BFILE類型的數(shù)據(jù)時,首先通過其getBinaryStream()方法得到二進(jìn)制的輸入流,然后操作這個輸入流就可以了。The limitation is your imagination。 PLSQL_FileExample.java實現(xiàn)的功能與上述的相同,只不過所有針對BFILE的操作都是通過調(diào)用pl/sql匿名塊來完成的,并使用了OracleCallableStatement。假如沒有必要,使用前者即可。 8、LobExample.java與PLSQL_LobExample.java 此示例使用了CLOB和BLOB數(shù)據(jù)類型。 插入數(shù)據(jù)時,需要分別通過getBinaryOutputStream()和getCharacterOutputStream()得到二進(jìn)制輸出流和字符輸出流,然后就是針對此輸出流的操作了,與傳統(tǒng)的 java I/O 相同。 讀取數(shù)據(jù)時,需要分別通過getBinaryStream()和getCharacterStream()得到二進(jìn)制輸入流和字符輸入流,然后就是針對此輸入流的操作了,與傳統(tǒng)的 java I/O 相同。 PLSQL_LobExample.java實現(xiàn)的功能與上述的相同,只不過所有針對CLOB和BLOB的操作都是通過調(diào)用pl/sql匿名塊來完成的,并使用了OracleCallableStatement。 假如沒有必要,使用前者即可。 注:7、8的第二個示例中均使用到了dbms_lob程序包。 上面我僅對ORACLE給我們提供的demo的極小的一部分給出了解釋,并加入我自己的看法。我也是想通過這篇文章,起到拋磚引玉的作用,希望廣大網(wǎng)友多對產(chǎn)品的示例進(jìn)行分析,從而得到最原汁原味的代碼。 你的意見,我愿意聽!! email:zbdlmxc@163.com
標(biāo)簽: JDBC
主站蜘蛛池模板: 自进式锚杆-自钻式中空注浆锚杆-洛阳恒诺锚固锚杆生产厂家 | 天津试验仪器-电液伺服万能材料试验机,恒温恒湿标准养护箱,水泥恒应力压力试验机-天津鑫高伟业科技有限公司 | 喷漆房_废气处理设备-湖北天地鑫环保设备有限公司 | VI设计-LOGO设计公司-品牌设计公司-包装设计公司-导视设计-杭州易象设计 | 最新电影-好看的电视剧大全-朝夕电影网 | uv固化机-丝印uv机-工业烤箱-五金蚀刻机-分拣输送机 - 保定市丰辉机械设备制造有限公司 | 代做标书-代写标书-专业标书文件编辑-「深圳卓越创兴公司」 | 深圳网站建设-高端企业网站开发-定制网页设计制作公司 | 沈阳建筑设计公司_加固改造设计_厂房设计_设计资质加盟【金辉设计】 | 盐水蒸发器,水洗盐设备,冷凝结晶切片机,转鼓切片机,絮凝剂加药系统-无锡瑞司恩机械有限公司 | 工业胀紧套_万向节联轴器_链条-规格齐全-型号选购-非标订做-厂家批发价格-上海乙谛精密机械有限公司 | 非标压力容器_碳钢储罐_不锈钢_搪玻璃反应釜厂家-山东首丰智能环保装备有限公司 | 纸布|钩编布|钩针布|纸草布-莱州佳源工艺纸布厂 | 2025世界机器人大会_IC China_半导体展_集成电路博览会_智能制造展览网 | 华中线缆有限公司-电缆厂|电缆厂家|电线电缆厂家 | 苏州同创电子有限公司 - 四探针测试仪源头厂家 | 高柔性拖链电缆_卷筒电缆_耐磨耐折聚氨酯电缆-玖泰特种电缆 | 冷水机-工业冷水机-冷水机组-欧科隆品牌保障 | 上海璟文空运首页_一级航空货运代理公司_机场快递当日达 | Win10系统下载_32位/64位系统/专业版/纯净版下载 | 重庆监控_电子围栏设备安装公司_门禁停车场管理系统-劲浪科技公司 | 罐体电伴热工程-消防管道电伴热带厂家-山东沃安电气 | 自动检重秤-动态称重机-重量分选秤-苏州金钻称重设备系统开发有限公司 | 环压强度试验机-拉链拉力试验机-上海倾技仪器仪表科技有限公司 | LHH药品稳定性试验箱-BPS系列恒温恒湿箱-意大利超低温冰箱-上海一恒科学仪器有限公司 | 土壤有机碳消解器-石油|表层油类分析采水器-青岛溯源环保设备有限公司 | 吨袋包装机|吨包秤|吨包机|集装袋包装机-烟台华恩科技 | 微波消解仪器_智能微波消解仪报价_高压微波消解仪厂家_那艾 | 西门子伺服控制器维修-伺服驱动放大器-828D数控机床维修-上海涌迪 | 上海APP开发-APP制作-APP定制开发-上海APP开发制作公司-咏熠科技 | 岸电电源-60HZ变频电源-大功率变频电源-济南诚雅电子科技有限公司 | 厦门ISO认证|厦门ISO9001认证|厦门ISO14001认证|厦门ISO45001认证-艾索咨询专注ISO认证行业 | 等离子空气净化器_医用空气消毒机_空气净化消毒机_中央家用新风系统厂家_利安达官网 | 阜阳在线-阜阳综合门户 | China plate rolling machine manufacturer,cone rolling machine-Saint Fighter | HDPE土工膜,复合土工膜,防渗膜价格,土工膜厂家-山东新路通工程材料有限公司 | 广州企亚 - 数码直喷、白墨印花、源头厂家、透气无手感方案服务商! | CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 铁艺,仿竹,竹节,护栏,围栏,篱笆,栅栏,栏杆,护栏网,网围栏,厂家 - 河北稳重金属丝网制品有限公司 山东太阳能路灯厂家-庭院灯生产厂家-济南晟启灯饰有限公司 | 立式壁挂广告机厂家-红外电容触摸一体机价格-华邦瀛 | 进口便携式天平,外校_十万分之一分析天平,奥豪斯工业台秤,V2000防水秤-重庆珂偌德科技有限公司(www.crdkj.com) |