ORACLE自带的JDBC源代码解析
时间:2007-12-23 来源:不详 作者:迈克DB
1、假如出现java.lang.UnsatisfiedLinkError:do_open,则你需要把DriverManager.getConnection()方法的url修改成jdbc:oracle:thin:@127.0.0.1:1521:oradb,具体原因未知;
2、假如出现java.sql.SQLException:不支持的字符集:oracle-character-set-852,则你需要把nls_charset12.zip加入你的工程中(此文件与classes12.zip同目录);
下面我就把文件夹\samples\oci8\object-samples下的文件做一个具体的功能描述:
1、PersonObject.java
这个例子演示了表people中存在ADT字段empid,其类型为PERSON,而且类型PERSON中存在ADT字段home,其类型为ADDRESS,而且类型ADDRESS是一个ADT。
假如使用常规SQL语句,其插入语句与在sql/plus中无异,即:使用构造函数嵌套构造。
另有一种方法,使用STRUCT的构造函数STRUCT(StructDescriptor,Connection,Object[])构造出一个STRUCT对象,即一个ADT对象。同时,假如有嵌套则需要嵌套构造ADT对象。最后通过PreparedStatement的setObject方法指定ADT对象即可。
读取数据时则采用与上述方法相逆的办法:假如是简单类型,则直接读取;假如是ADT,则使用ResultSet的getObject(),再强制转换成STRUCT,然后调用STRUCT的getAttributes()方法取得Object[]类型数据,如是递归。
本文来自织梦
2、SQLDataExample.java与EmployeeObj.java
此例与1中相似,也是对ADT的处理,不同的是类型没有嵌套。
比较而言,2比1的代码简洁了很多,不过也是付出了代价:为类型EMPLOYEE抽象出一个类EmployeeObj,它实现了SQLData接口,并重写了三个方法(必须的)。
前台的调用比1中的第二种方法简洁了很多,只需要直接使用PreparedStatement的setObject方法指定ADT对象即可(不过需要指定其类型为OracleTypes.STRUCT)。读取时也可直接使用OracleResultSet的getObject()并强制转换成EmployeeObj对象即可。
真可谓是:有得必有失!!
另,此例中有几处需要注重的地方:
2.1EmployeeObj.java中的importoracle.jdbc2.*;改成importoracle.jdbc.*;原因未知;
2.2SQLDataExample.java中的Dictionarymap=conn.getTypeMap();改成java.util.Mapmap=conn.getTypeMap();原因:NOTE:Thisclass(指的是Dictionary)isobsolete.NewimplementationsshouldimplementtheMapinterface,ratherthanextendidngthisclass.(来源:javadoc);
2.3SQLDataExample.java中的pstmt.executeQuery();改成pstmt.executeUpdate();更合理些,因为这是更新而非查询(不改也不会影响功能,只是建议);
3、CustomDatumExample.java与Employee.java
本文来自织梦
此例与2完全相同。不同的是采用了另外一种抽象技术,并实现了接口CustomDatum与CustomDatumFactory,并重写了二个方法toDatum()与create()。在前台访问数据时亦有少许不同:采用了OracleResultSet的getCustomDatum()方法并把它强制转换成Employee。从外观上看,2中SQLData接口存在于java.sql.*包中;而接口CustomDatum与CustomDatumFactory则存在于oracle.sql.*包中,可以认为是Oracle公司对自己产品的专门实现。或许有更高的性能、更小的开销?不过3不如2来得直接,个人认为。
4、ArrayExample.java
从文件名可看出,此示例演示的是VARRAY类型。
同1,插入亦有两种方法。一种可直接使用SQL;另外,可使用OraclePreparedStatement的setARRAY方法,构造ARRAY的过程与构造STRUCT无异。数据的读取过程与此相反:先使用OracleResultSet的getARRAY()方法取得ARRAY对象,再调用此对象的getArray()方法并强制转换成对象数组,然后对此数组操作即可。
5、PersonRef.java与StudentRef.java
不知是不是ORACLE与我们开玩笑,这两个文件除了类名不同外,其余一切相同。
这个例子给我们演示的是对象表的概念。对象表的插入与普通表没有任何不同,数据的读取首先体现在其SQL上,需要使用REF函数,然后调用ResultSet的getObject()方法并强制转换成REF对象,再利用此对象的getValue()并转换成STRUCT对象,再利用此对象的getAttributes()方法得到Object[],然后对此数组操作即可。
上一篇:linux下安装oracle9i 下一篇:说Oracle的MTS
文章评论
共有位Admini5网友发表了评论 查看完整内容