仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 969|回复: 8
打印 上一主题 下一主题

[学习教程] MYSQL网页设计ORACLE自带的JDBC源代码剖析

[复制链接]
飘飘悠悠 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:31:58 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
使用DBaaS能让收入损失从其他业务上得到弥补,如软件更新和硬件管理。也许决定走DBaaS之路的客户可能会跳过解决方案提供商,尽管这个决策看起来有点短视。oracle|源代码
年夜凡利用过JDBC连ORACLE的人城市晓得如许一个现实:我们必要的库文件classes12.zip存在于$ORACLE_HOME/jdbc/lib目次下(但仍有部分菜鸟屡屡在论坛上求此库文件,真是辛劳);但很少有人晓得ORACLE还为我们筹办了利用jdbc的示例,它存在于$ORACLE_HOME/jdbc/demo/demo.zip中。
前一段工夫,我进修ORACLE的OOP手艺,很受震动。事先我想:JDBC中必定存在某些OO手艺以撑持它。好久都没有找到符合的例子,最初在ORACLE的安装目次下找到它。真可谓是:踏破铁鞋无觅处,得来全不费光阴。

商定:
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同目次);

上面我就把文件夹amplesoci8object-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[],然后对此数组操纵便可。

6、RefClient.java与GenREF.java
ThissampledemonstratesusingREFovertwodifferentSessions.
类GenREF用来封装REF工具所指向的范例及其二进制内容。程序先MaterializeintoGenREF,然后在另外一会话中De-materializeREFfromGenREF,上面就与处置REF不异:使用此工具的getValue()并转换成STRUCT工具,再使用此工具的getAttributes()办法失掉Object[],然后对此数组操纵便可。

7、FileExample.java与PLSQL_FileExample.java
此示例利用BFILE数据范例,Containsalocator(定位器)toalargebinaryfilestoredoutsidethedatabase。数据拔出时必要利用函数bfilename,这个函数必要目次工具,此工具必要利用createdirectorymydir来创立(此用户需具有CREATEANYDIRECTORY体系权限)。我曾在这个中央有个年夜教导:按着步骤做,可在读取时老是提醒我没有此目次!!最初,我把BFILENAME函数的第一个参数(即目次名)年夜写就行了。缘故原由:目次名在函数中辨别巨细写,固然我们创立它时用的是小写,可到了数据库中后就主动酿成了年夜写。
读取BFILE范例的数据时,起首经由过程其getBinaryStream()办法失掉二进制的输出流,然后操纵这个输出流就能够了。Thelimitationisyourimagination。
PLSQL_FileExample.java完成的功效与上述的不异,只不外一切针对BFILE的操纵都是经由过程挪用pl/sql匿名块来完成的,并利用了OracleCallableStatement。假如没有需要,利用前者便可。

8、LobExample.java与PLSQL_LobExample.java
此示例利用了CLOB和BLOB数据范例。
拔出数据时,必要分离经由过程getBinaryOutputStream()和getCharacterOutputStream()失掉二进制输入流和字符输入流,然后就是针对此输入流的操纵了,与传统的javaI/O不异。
读取数据时,必要分离经由过程getBinaryStream()和getCharacterStream()失掉二进制输出流和字符输出流,然后就是针对此输出流的操纵了,与传统的javaI/O不异。
PLSQL_LobExample.java完成的功效与上述的不异,只不外一切针对CLOB和BLOB的操纵都是经由过程挪用pl/sql匿名块来完成的,并利用了OracleCallableStatement。假如没有需要,利用前者便可。

注:7、8的第二个示例中均利用到了dbms_lob程序包。

下面我仅对ORACLE给我们供应的demo的极小的一部分给出懂得释,并到场我本人的意见。我也是想经由过程这篇文章,起到举一反三的感化,但愿宽大网友多对产物的示例举行剖析,从而失掉最原汁原味的代码。

你的定见,我乐意听!!email:zbdlmxc@163.com
由于在MySQL中有如此众多的额外功能可选,诸如存储引擎等,你可以选择最适合你公司的一个,或者尝试选用多个引擎。MySQL开始非常小巧,但是可以随着公司的成长而不断地变强大。
小女巫 该用户已被删除
9#
发表于 2015-3-17 23:10:18 | 只看该作者
我个人认为就是孜孜不懈的学习
活着的死人 该用户已被删除
8#
发表于 2015-3-11 07:28:09 | 只看该作者
学习SQL语言的话如果要学会去做网站就不是很难!但是要做数据库管理的话就有难度了!
不帅 该用户已被删除
7#
发表于 2015-3-2 23:38:01 | 只看该作者
你可以简单地认为适合的就是好,不适合就是不好。
只想知道 该用户已被删除
6#
发表于 2015-2-12 06:36:30 | 只看该作者
再开发调试阶段和OLAP环境中,外键是可以建立的。新版本中加入了SETNULL和SETDEFAULT属性,能够提供能好的级联设置。
老尸 该用户已被删除
5#
发表于 2015-2-5 14:26:01 | 只看该作者
语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!
变相怪杰 该用户已被删除
地板
发表于 2015-1-28 05:35:39 | 只看该作者
一个是把SQL语句写到客户端,可以使用DataSet进行加工;
愤怒的大鸟 该用户已被删除
板凳
发表于 2015-1-19 16:12:56 | 只看该作者
其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。
简单生活 该用户已被删除
沙发
发表于 2015-1-19 16:12:56 | 只看该作者
这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否会出现大规模的碎片?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-15 11:14

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表