JDBC驱动程序与数据库系统架构

上传人:m**** 文档编号:569086735 上传时间:2024-07-27 格式:PPT 页数:75 大小:1.21MB
返回 下载 相关 举报
JDBC驱动程序与数据库系统架构_第1页
第1页 / 共75页
JDBC驱动程序与数据库系统架构_第2页
第2页 / 共75页
JDBC驱动程序与数据库系统架构_第3页
第3页 / 共75页
JDBC驱动程序与数据库系统架构_第4页
第4页 / 共75页
JDBC驱动程序与数据库系统架构_第5页
第5页 / 共75页
点击查看更多>>
资源描述

《JDBC驱动程序与数据库系统架构》由会员分享,可在线阅读,更多相关《JDBC驱动程序与数据库系统架构(75页珍藏版)》请在金锄头文库上搜索。

1、JDBC驱动程序与数据库系统架构pengbin一、中间件概述o中间件的定义中间件的定义n(定义一)中间件是分布式环境中保证操作系统、(定义一)中间件是分布式环境中保证操作系统、通信协议、数据库等之间进行通信协议、数据库等之间进行对话对话、互操作互操作的软的软件系统。件系统。n(定义二)(定义二)中间件中间件是一种独立的是一种独立的系统系统软件软件或或服务服务程序程序,分布式应用软件借助这种软件在不同的技,分布式应用软件借助这种软件在不同的技术之间术之间共享资源共享资源,中间件位于客户机服务器的,中间件位于客户机服务器的操操作系统作系统之上,管理计算资源和网络通信。之上,管理计算资源和网络通信。

2、 o理解理解n中间件是层次型系统架构的关键成分之一,可同中间件是层次型系统架构的关键成分之一,可同时存在于客户端和服务器端,负责客户和服务器时存在于客户端和服务器端,负责客户和服务器之间透明的请求和回答交互。之间透明的请求和回答交互。n中间件属于可复用软件的范畴。中间件属于可复用软件的范畴。n中间件处于系统软件与用户的应用软件的中间,中间件处于系统软件与用户的应用软件的中间,总的作用是为处于自己上层的应用软件提供运行总的作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件。成复杂的应用软件。 o中间件的特性中

3、间件的特性n网络透明性:能支持所有类型的网络;n服务器透明性:不管服务器上的DBMS是何种型号,一个好的数据库中间件应该能通过标号的SQL语言与不同的DBMS上的SQL语言连接起来。n语言透明性:客户机可用任何开发语言进行发送请求和接收回答,被调用的功能应该像语言那样也是独立的。中间件还应该保证开发语言的数据类型和服务器上数据库使用的数据类型之间能够相互转换。n中间件保证了客户机和服务器之间的联系,使网络、数据库、操作系统对于应用软件的开发界面透明化。o数据库中间件数据库中间件:n用于数据库访问,可使有关代码不依赖于某一具体数据库及数据库所在的平台,从而可将更多的精力集中在功能的设计上。nOD

4、BCnJDBCnADO.NET二、ODBCoODBC是微软公司提出的一组规范,该规范提供一组访问关系数据库的标准API(基于C语言)。n分层结构n仅支持微软的开发平台nODBC Driver由各厂商实现C/C+ ApplicationC/C+ ApplicationODBC APIODBC APIODBC Driver ManagerODBC Driver ManagerODBC DriverODBC Driver关系数据关系数据提供应用系统与数据库平台的独立性;数据库厂商提供ODBC的体系结构的体系结构应用程序:提供用户界面、应用逻辑和事务逻辑一组函数,供用户应用程序调用。管理应用程序与OD

5、BC驱动程序之间的通信(加载驱动、管理数据源、检查ODBC调用参数等等)ODBC数据源如何使用ODBCo先建立一个先建立一个ODBCODBC数据源,应用程序通过数据源与具体的数据数据源,应用程序通过数据源与具体的数据库交互库交互。n数据源(Data Source Name,DSN)是驱动程序与DBS连接的桥梁,是用于表达一个ODBC驱动程序和DBMS特殊连接的命名。o数据源名代表用户名、服务器和所连接的数据库名等。o代表一个与具体数据库所建立的连接。n数据源分类o用户数据源o系统数据源o文件数据源o演示ODBC数据源的创建过程三、JDBCoJDBC(JavaDatabaseConnectivi

6、ty)是Sun公司给出的一个Java语言访问关系数据库的Java接口标准,这个标准基于X/OpenSQLCallLevelInterface,并与SQL92入门级标准兼容。n各数据库供应商可以在他们的驱动程序中实现并扩展这个接口。相应的驱动程序称为JDBC驱动程序。一般厂家在实现JDBC接口,设计自己的JDBC驱动程序时,都有个性化的处理。o如Oracle的Jdbc驱动程序除了支持标准的JDBCAPI,还支持Oracle特定的数据类型以提高性能.Java ApplicationJava ApplicationJDBC APIJDBC APIJDBC Driver ManagerJDBC Dri

7、ver ManagerJDBC DriverJDBC Driver数据源数据源中间件中间件oSUN公司给出的JDBCAPI标准有多个版本,最新为4.0,但大多数厂家的驱动程序仅实现或部分实现了3.0标准。所以jdbc标准规定的api不一定可用。njava.sql packagejava.sql packagenjavax.sql packagejavax.sql package3.1、JDBC驱动程序分类oJDBC-ODBC桥驱动程序ODBC驱动程序n客户程序所在主机安装了ODBC驱动程序,并创建了ODBC数据源。nJDBC-ODBC桥驱动程序由sun免费提供,封装在JDK中。o本地API部分

8、JAVA驱动程序n驱动一部分用Java语言编写,一部分用本地代码编写,把JDBC调用转换为对Oracle, Sybase, Informix, IBM DB2, 或其它DBMS的客户端的调用.n客户程序所在主机要求装有特定数据库厂商的驱动程序。oJDBC-NET纯java驱动程序n驱动程序用Java编写,把JDBC调用转给一个独立于数据库管理系统的网络中间件,该中间件再把调用传给DBMS。n系统中需要配置一个专门的驱动程序中间件服务器。n灵活性大o本地协议纯java驱动程序n驱动把JDBC调用直接转换给DBMS使用的网络协议,是网络访问的极好方案。3.2、OracleJDBC驱动程序Oracl

9、eJDBC驱动程序的分类o用于客户端nJDBC Thin client-side driver(客户端Thin驱动程序): o第四类JDBC驱动程序,纯Java语言实现,直接建立Java套接字连接Oracle,运行不需要安装Oracle客户端软件,可用于applet和应用程序。nJDBC OCI client-side driver(客户端OCI驱动程序):o 第二类JDBC驱动程序,使用Java本地方法调用底层的C库(OCI,即Oracle Call Interface) 与Oracle数据库交互,运行需要安装Oracle客户端。不使用于 Java applets,一般部署于Web服务器等中

10、间层,有连接池支持,性能较高。o用于服务器端nJDBC Thin server-side driver(服务器端Thin驱动程序): o第四类JDBC驱动程序。Oracle服务器上的Java代码可使用其访问同一机器上的另一个连接或另一个远程机器(包括中间件服务器)。nJDBCServer-SideInternaldriver(服务器端内部驱动程序): o第二类驱动程序, Oracle服务器上的Java代码使用这种驱动程序直接访问SQL引擎,避免了网络负担,速度最快,但只能访问服务器所在的哪个数据库. OracleJDBC驱动程序的选择o除非要支持非TCP/CP协议而选择OCI程序,一般情况下使

11、用Thin程序,10g版本的Thindriver有极好的性能和功能。o如果要支持可移植性和性能,使用Thindriver。可以在JAVA应用程序或applet中使用Thin程序。o如果要SSL上使用LDAP,使用Thindriver。oIfyouarewritingaclientapplicationforanOracleclientenvironmentandneedOCI-driver-specificfeatures,suchassupportfornon-TCP/IPnetworks,thenchoosetheJDBCOCIdriver.oIfyouarewritinganapplet

12、,youmustusetheThindriver.oForcodethatrunsinanOracleserveractingasamiddletier,usetheserver-sideThindriver.oIfyourcodewillruninsidethetargetOracleserver,thenusetheJDBCserver-sideinternaldrivertoaccessthatserver.(Youcanalsoaccessremoteserversusingtheserver-sideThindriver.)3.3、寻求帮助文档(企业版)oORACLE_HOME/jd

13、bc下nDemoodemo.zip:SQL和PL/SQL的例子nDoc:ojavadoc.zip:OracleJDBCAPIdocumentation.nLiboorai18n.jar:全球化和多字节字符支持oclasses12.jar(classes12_g.jar):JDK1.21.3oojdbc14.jar(ojdbc14_g.jar):JDK1.4.oocrs12.jar:支持Rowset.oORACLE_HOME/jlibnjta.jar和jndi.jar3.4、环境变量设置o设置环境变量ORACLE_HOMEnd:oraclexeapporacleproduct10.2.0serv

14、er(XE版本)o使用Thindriver,需要设置CLASSPATH:n对于XE,ORACLE_HOME/jdbc/lib/ojdbc14.jar和ORACLE_HOME/jlib/orai18n.jar加入n对于企业版,可能把classes12.jar和orai18n.jar加入njta.jar和jndi.jar可选o使用OCIDriver,需要设置PATH环境变量:n把ORACLE_HOMEbin加入path中四、JDBC驱动程序使用步骤o4.1、引入相关的类nimportjava.sql.*;nimportoracle.jdbc.*;/使用Oracle特性nimportoracle.j

15、dbc.pool.*;/使用Oracle特性nimportoracle.sql.*;o4.2、创建连接对象(优先使用Datasource,而不是DriverManager)n使用数据源设置连接属性,创建连接对象oOracleDataSourceods=newOracleDataSource();oods.setDriverType(oci);oods.setServerName(dlsun999);oods.setNetworkProtocol(tcp);oods.setDatabaseName(816);oods.setPortNumber(1521);oods.setUser(scott)

16、;oods.setPassword(tiger);oConnectionconn=ods.getConnection();nConnectionconn=ods.getConnection(“bill”,“lion”);覆盖属性设置n使用URL设置连接属性,创建连接对象oOracleDataSourceods=newOracleDataSource();nStringURL=jdbc:oracle:thin:/myhost:1521/orcl,nods.setURL(URL);nods.setUser(scott);nods.setPassword(tiger);nConnectionconn

17、=ods.getConnection();nStringURL=jdbc:oracle:thin:scott/tiger/myhost:1521/orcl);nods.setURL(URL);nConnectionconn=ods.getConnection();nStringURL=jdbc:oracle:oci:scott/tigermyTNSEntry);nods.setURL(URL);nConnectionconn=ods.getConnection();n在初始化数据源之后,把数据源与JNDI绑定,再创建连接对象oContextctx=newInitialContext();oct

18、x.bind(jdbc/sampledb,ods);oOracleDataSourceodsconn=(OracleDataSource)ctx.lookup(jdbc/sampledb);oConnectionconn=odsconn.getConnection();补充JDBCURLojdbc:oracle:driver_type:username/passworddatabase_specifier;其中database_specifier部分有诸多变化oThin型驱动njdbc:oracle:thin:scott/tiger/myhost:1521/service_namendbc:o

19、racle:thin:ldap:/:7777/sales,cn=OracleContext,dc=comLDAP语法njdbc:oracle:thin:ldaps:/:7777/sales,cn=OracleContext,dc=comSSLnjdbc:oracle:thin:(DESCRIPTION=(LOAD_BALANCE=on)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host1)(PORT=1521)(ADDRESS=(PROTOCOL=TCP)(HOST=host2)(PORT=1521)(CONNECT_DATA=(SERVICE_NA

20、ME=service_name)oOCI型驱动njdbc:oracle:oci:(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=cluster_alias)(PORT=1521)(CONNECT_DATA=(SERVICE_NAME=service_name)njdbc:oracle:oci:scott/tigero4.3、创建语句对象nStatementstmt=conn.createStatement();o4.4、使用语句对象执行SQL语句nDML语句oInti=stmt.excuteUpdate(“deletefromempwhereeno=1234

21、“)n查询语句oResultSetrset=stmt.executeQuery(SELECTename,eageFROMemp);o4.5处理语句执行结果nDML语句oIf(i=1)thenn查询语句owhile(rset.next()oSystem.out.println(rset.getString(1);oSystem.out.println(rset.getInt(2);oo4.6、关闭连接结果集和语句对象nrset.close();nstmt.close();附注、ORacle数据源属性oOracleDataSource针对如下标准属性,有setter/getternserverNa

22、me:数据库服务器名:数据库服务器名ndatabaseName:服务器上特定的数据库,Oracle中为SID;ndataSourceName:所用数据源的类名nDescription:数据源的描述nnetworkProtocol:通讯协议,缺省为TCPnUser:登录帐号nPassword:登录帐号的密码nportNumberint:服务器监听端口oOracleDataSource针对如下Oracle自身属性,有setter/getternconnectionCacheName:连接cache名nconnectionCacheProperties:隐式连接cache的属性nconnection

23、CachingEnabled:指定隐式连接cache是否使用nconnectionProperties:连接属性ndriverType:驱动类型ci,thin,orkprbnfastConnectionFailoverEnablednimplicitCachingEnabled:隐式连接是否有效nloginTimeoutnlogWriternmaxStatements:cache中statement对象的个数nserviceName:数据库服务名ntnsEntry:OCI驱动用的tnsentry名nurl:连接串nnativeXABoolean附注:语句对象Statementoexecute(

24、Stringsql):Boolean,RunsthegivenSQLstatement,whichmayreturnmultipleresults.oexecuteBatch():int,Submitsabatchofcommandstothedatabaseforrunning,andreturnsanarrayofupdatecountsifallcommandsrunsuccessfully.oexecuteQuery(Stringsql):ResultSet,RunsthegivenSQLstatement,whichreturnsasingleResultSetobject.oexe

25、cuteUpdate(Stringsql):int,RunsthegivenSQLstatement,whichmaybeanINSERT,UPDATE,orDELETEstatementoranSQLstatementthatreturnsnothing,suchasanSQLDDLstatement.附注:结果集ResutsetoAResultSetobjectcontainsatableofdatarepresentingadatabaseresultset,whichisgeneratedbyexecutingastatementthatqueriesthedatabase.oAcur

26、sorpointstothecurrentrowofdatainaResultSet.Initially,itispositionedbeforethefirstrow.YouusethenextmethodoftheResultSetobjecttomovethecursortothenextrowintheresultset.ItreturnsfalsewhentherearenomorerowsintheResultSetobject.Typically,thecontentsofaResultSetarereadbyusingthenextmethodwithinaloopuntili

27、treturnsfalse.oTheResultSetinterfaceprovidesgettermethods(getBoolean,getLong,getInt,andsoon)forretrievingcolumnvaluesfromthecurrentrow.Valuescanberetrievedusingeithertheindexnumberofthecolumnorthenameofthecolumn.oForthegettermethods,JDBCdriversconverttheunderlyingdatatotheJavatypespecifiedinthegette

28、rmethodwhereverpossible.TheJDBCspecificationhasatableshowingtheallowablemappingsfromSQLtypestoJavatypesthatcanbeusedbytheResultSetgettermethods.o默认情况下,同一时间只有一个ResultSet对象对应一个Statement对象。如果需要在一个连接接中从多个ResultSet对象中读取数据,就需要使用多个Statement对象。如果Statement被关闭,或者重新运行,或者从该语句对象获取下一个ResultSet,则原Resultset对象自动关闭。o

29、结果集的特性n可滚动,定位和灵敏度(Scrollability, Positioning, and Scrollability, Positioning, and SensitivitySensitivity):可滚动指结果集指针可前后移动;可定位指结果集指针可相对或绝对定位到特定行;灵敏度指结果集对底层数据改变的敏感性。据此设置Resultset的类型oForward-only:不可滚动、定位,不敏感。oScroll-sensitive:可滚动和定位,不敏感。oScroll-insensitive:可滚动、定位和敏感。n可更新(Updatability ):可否对结果集进行更新操作,并把更新

30、结果反映到数据库中。这与并发控制有关,据此设置并发类型:oUpdatable:可对结果集进行更新、插入、删除操作,并反映到数据库。oRead-only:不可修改o组合如下nForward-only/read-onlynForward-only/updatablenScroll-sensitive/read-onlynScroll-sensitive/updatablenScroll-insensitive/read-onlynScroll-insensitive/updatableo创建语句对象的同时指明语句对象所创建的结果集的特性nstmt=conn.createStatement(intr

31、esultSetType,intresultSetConcurrency):预定义常量如下oResultSet.TYPE_FORWARD_ONLY|ResultSet.TYPE_SCROLL_SENSITIVE|ResultSet.TYPE_SCROLL_INSENSITIVEoResultSet.CONCUR_READ_ONLY|ResultSet.CONCUR_UPDATABLEoOracleJDBCDriver实现上述特性的机制nScrollability:在客户端建立一个缓充,存放可滚动的结果集。因此,这个特性不适合较大结果集。nupdatability:jdbc自动在查询列中包含RO

32、WID,不需要客户端缓冲o创建可更新的结果集的查询语句只能操作单表,不能有连接运算;不用用select*;只能用列,不能用派生列和聚集函数o在可更新的结果集中调用deleteRow()方法后,如果自动提交为true,则立马反映到数据库;o在可更新的结果集中实现update:先update相关列,再调用updateRow()方法;o在可更新的结果集中实现insert:先调用moveToInsertRow()方法,再update相关列,最后调用insertRow()方法;n再实现可更新特性时,不考虑并发冲突(比如另有一个事务在处理同一记录);为避免冲突,可使用FORUPDATE子句或其它并发控制机

33、制。例1、使用JDBC-ODBC桥驱动程序o前提n运行程序的计算机上安装了ODBC驱动;配置了数据源;装有JDKo步骤n1.加载驱动Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);n2.得到连接Connectionct=DriverManager.getConnection(jdbc.odbc:testConnectOracle,scott,tiger);n3.创建语句对象Statementsm=ct.createStatement();n4.获取结果ResultSetrs=sm.executeQuery(select*fromemp);n5.处理结果w

34、hile(rs.next()System.out.println(用户名:+rs.getString(2);n6.关闭对象rs.close();smclose();cn.close();例2、使用纯JDBC驱动otryoClass.forName(oracle.jdbc.driver.OracleDriver);oConnectionct=nDriverManager.getConnection(jdbc:oracle:thin:127.0.0.1:1521:orcl,scott,tiger);oStatementsm=ct.createStatement();oResultSetrs=sm.

35、executeQuery(select*fromemp);owhile(rs.next()nSystem.out.println(用户名:+rs.getString(2);oocatch(Exceptione)e.printStackTrace();ofinallyo/关闭对象ooo使用预编译语句对象提高性能(DML语句)oPreparedStatementpstmt=oconn.prepareStatement(insertintoEMP(EMPNO,ENAME)values(?,?);o/AddLESLIEasemployeenumber1500opstmt.setInt(1,1500);

36、/Thefirst?isforEMPNOopstmt.setString(2,LESLIE);/Thesecond?isforENAMEopstmt.execute();o/AddMARSHAasemployeenumber507opstmt.setInt(1,507);/Thefirst?isforEMPNOopstmt.setString(2,MARSHA);/Thesecond?isforENAMEopstmt.execute();o/Closethestatementopstmt.close();ocon.close();ConectionStatementPrepareStateme

37、ntCallableStatementData TypeResultprepareCallcreateStatementlprepareStatementlexcuteQueryexcuteUpdategetXXXX整数五、数据库、jdbc、java类型之间的映射六、JDBC中的流处理o三种流nbinarystreamUsedforRAWbytesofdata.ThiscorrespondstothegetBinaryStream()method.nASCIIstreamUsedforASCIIbytesinISO-Latin-1encoding.Thiscorrespondstotheget

38、AsciiStream()method.nUnicodestreamUsedforUnicodebyteswiththeUTF-16encoding.ThiscorrespondstothegetUnicodeStream()method.o如果一次查询返回多个列,其中有一个或多个流,则在前面的留处理结束前,后面的列不能处理。如果遇到不想处理的流,则可以直接将该流close()。建议按顺序读取数据;注意流一旦读取就不能再读了;o流处理LONGRAWDatangetBinaryStream()返回RAW数据原型ngetAsciiStream()转换RAW数据为十六进制,并返回该十六进制代表的字符

39、ngetUnicodeStream()转换RAW数据为十六进制,返回Unicode字节;o流处理LONGDatangetAsciiStream():假定数据库使用US7ASCII或WE8ISO8859P1字符集来创建流,并返回相应的ASCII字符。如果该假定不合实际,将带来乱码。ngetUnicodeStream():以UTF-16编码获取Unicode字符。ngetBinaryStream():oJDBCOCI驱动客户端字符集不是US7ASCIIorWE8ISO8859P1,返回UTF-8字节流.客户端字符集是US7ASCII或WE8ISO8859P1,返回US7ASCII字节流;oJDBC

40、Thin驱动数据库端字符集不是US7ASCIIorWE8ISO8859P1,返回UTF-8.如果数据库端字符集是US7ASCIIorWE8ISO8859P1,返回US7ASCII字节流;o例1、使用流的reader()方法,依次读取数据ncreatetablestreamexample(NAMEvarchar2(256),GIFDATAlongraw);ninsertintostreamexamplevalues(LESLIE,00010203040506070809);nResultSetrset=stmt.executeQueryn(selectGIFDATAfromstreamexamp

41、lewhereNAME=LESLIE);nif(rset.next()nn/GettheGIFdataasastreamfromOracletotheclientnInputStreamgif_data=rset.getBinaryStream(1);ntrynFileOutputStreamfile=null;nfile=newFileOutputStream(leslie.gif);nintchunk;nwhile(chunk=gif_data.read()!=-1)nfile.write(chunk);ncatch(Exceptione)nStringerr=e.toString();n

42、System.out.println(err);nfinallyniffile!=null()nfile.close();nno例2、使用getSize()方法,一次读取数据到数组中oResultSetrset2=stmt.executeQueryo(selectGIFDATAfromstreamexamplewhereNAME=LESLIE);o/getfirstrowoif(rset2.next()oobytebytes=rset2.getBytes(1);/一次完成,内存压力大otryooFileOutputStreamfile=null;ofile=newFileOutputStrea

43、m(leslie2.gif);ofile.write(bytes);oocatch(Exceptione)ooStringerr=e.toString();oSystem.out.println(err);oofinallyooiffile!=null()ofile.close();oon当LONG、LONGRAW列的数据较小,这时可以重新定义列类型,然后以VARCHAR或VARBINAR列类型读取,o/把statementstmt转换为OracleStatementooracle.jdbc.OracleStatementostmt=(oracle.jdbc.OracleStatement)s

44、tmt;o/redefinetheLONGcolumnatindexposition1toVARBINARYoostmt.defineColumnType(1,Types.VARBINARY);o/DoaquerytogettheimagesnamedLESLIEoResultSetrset=ostmt.executeQueryo(selectGIFDATAfromstreamexamplewhereNAME=LESLIE);o/Thedataisnotstreamedhereorset.next();obytebytes=rset.getBytes(1);o流处理CHAR,VARCHAR,o

45、rRAWColumnsn如果使用defineColumnType()重定义CHAR,VARCHAR,RAW列为LONGVARCHAR或LONGVARBINARY,可以以流的方式获取数据,程序自动把列作为LONG或LONGRAW类型.n如果没有重定义类型,这时jdbc的executeQuery()方法或next()方法先把数据抓取到内存缓冲区,getXXXStream()从缓冲区读取数据;o流处理大对象(BLOB、CLOB)和外部文件(BFILE)类型。n可以用流输入/输出大对象列的数据n也可以先获取一个LOB定位器,再据定位器获取流o使用PreparedStatement对象时,常需要向该对象

46、传递数据,由于setBytes()的尺寸限制是2000字节,setString()的尺寸限制是4000字节,因此当尺寸过大时需要setBinaryStream()或setCharacterStream()的支持七、JDBC的事务处理o缺省情况下,jdbc执行一条DMLSQL语句后立即提交,即保持语句级的原子性。要实现一个语句序列的原子性,需要对connection做一些设置。n设置事务提交模式oconn.setAutoCommit(false);o当自动提交关闭后,如果关闭连接时没有显式提交或者回滚,会产生一个隐式的提交;由于DDL语句隐含一个提交,一旦执行DDL语句,则当前的DML、DDL都

47、会提交。n设置隔离级别oconn.setTransactionIsolation(inti)nConn.TRANSACTION_NONEnConn.TRANSACTION_READ_COMMITTEDnConn.TRANSACTION_READ_UNCOMMITTEDnConn.TRANSACTION_REPEATABLE_READnConn.TRANSACTION_SERIALIZABLEoconn.getTransactionIsolation();返回当前事务的隔离级别例子oConnectionct=null;otryoClass.forName(oracle.jdbc.driver.O

48、racleDriver);/1.加载驱动o/2.得到连接oct=DriverManager.getConnection(jdbc:oracle:thin:127.0.0.1:1521:orcl,scott,tiger);o/加入事务处理oct.setAutoCommit(false);/设置不能默认提交oStatementsm=ct.createStatement();osm.executeUpdate(updateempsetsal=sal-100whereename=SCOTT);/从scott的sal中减去100ointi=7/0;osm.executeUpdate(updateemps

49、etsal=sal+100whereename=SMITH);o/提交事务mit();o/关闭打开的资源osm.close();oct.close();ocatch(Exceptione)o/如果发生异常,就回滚otryoct.rollback();ocatch(SQLExceptione1)oe1.printStackTrace();ooe.printStackTrace();ooo八、JDBC调用存储过程oPL/SQLStoredProceduresnSQL92语法oCallableStatementcs1=conn.prepareCall(callproc(?,?);/storedpro

50、coCallableStatementcs2=conn.prepareCall(?=callfunc(?,?);/storedfuncnOraclePL/SQL块语法oCallableStatementcs3=conn.prepareCall(beginproc(?,?);end;);/storedprocoCallableStatementcs4=conn.prepareCall(“begin?:=func(?,?);end;”);/storedfuncoJava存储过程n语法同上例1、调用一个返回标量的函数o存储过程ncreateorreplacefunctionfoo(val1char)

51、nreturncharnasnbeginnreturnval1|suffix;nend;oJdbc调用nOracleDataSourceods=newOracleDataSource();nods.setURL(jdbc:oracle:oci:);nods.setUser(scott);nods.setPassword(tiger);nConnectionconn=ods.getConnection();nCallableStatementcs=conn.prepareCall(begin?:=foo(?);end;);ncs.registerOutParameter(1,Types.CHAR

52、);/第一个?对应函数返回值,需要注册数据类型ncs.setString(2,aa);ncs.executeUpdate();/executeUpdate方法nStringresult=cs.getString(1);例2、调用一个有输入无输出的过程nClass.forName(oracle.jdbc.driver.OracleDriver);nConnectioncn=nDriverManager.getConnection(jdbc:oracle:thin127.0.0.1:1521:MYORA1,scott,m123);nCallableStatementcs=ct.prepareCal

53、l(callsp_pro3(?,?);ncs.setString(1,SMITH);ncs.setInt(2,10);ncs.execute();/execute方法ncs.close();ncn.close();oCallableStatementcs=ct.prepareCall(callsp_pro8(?,?,?,?);ocs.setInt(1,7788);/in模式参数ocs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);ocs.registerOutParameter(3,oracle.jdbc.OracleTypes

54、.DOUBLE);ocs.registerOutParameter(4,oracle.jdbc.OracleTypes.VARCHAR);o/out模式参数ocs.execute();/execute方法o/取出返回值,要注意?的顺序oStringname=cs.getString(2);oStringjob=cs.getString(4);oSystem.out.println(7788的名字+name+工作:+job);例3、调用一个多输入,单输出的过程nCallableStatementcs=ct.prepareCall(“callsp_pro9(?,?)”);ncs.setInt(1,

55、10);ncs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);ncs.execute();/execute方法nResultSetrs=(ResultSet)cs.getObject(2);nwhile(rs.next()nSystem.out.println(rs.getInt(1)+rs.getString(2);n例4、调用一个输出游标的过程nJdbc调用分页存储过程n/创建CallableStatementnCallableStatementcs=ct.prepareCall(callfenye(?,?,?,?,?,?);

56、ncs.seString(1,emp);ncs.setInt(2,5);ncs.setInt(3,2);ncs.registerOutParameter(4,oracle.jdbc.OracleTypes.INTEGER);n/注册总页数ncs.registerOutParameter(5,oracle.jdbc.OracleTypes.INTEGER);n/注册返回的结果集ncs.registerOutParameter(6,oracle.jdbc.OracleTypes.CURSOR);n/5.执行ncs.execute();例5、Oracle分页存储过程的使用o/取出总记录数/这里要注意

57、,getInt(4)中4,是由该参数的位置决定的ointrowNum=cs.getInt(4);ointpageCount=cs.getInt(5);oResultSetrs=(ResultSet)cs.getObject(6);o/显示一下,看看对不对oSystem.out.println(rowNum=+rowNum);oSystem.out.println(总页数=+pageCount);owhile(rs.next()oSystem.out.println(编号:+rs.getInt(1)+名字:+rs.getString(2)+工资:+rs.getFloat(6);oocatch(E

58、xceptione)oe.printStackTrace();ofinallyo/6.关闭各个打开的资源ocs.close();oct.close();oooo存储过程nPROCEDUREINSERT_EMPLOYEE(op_first_nameemployees.first_name%type,op_last_nameemployees.last_name%type,op_emailemployees.email%type,op_phone_numberemployees.phone_number%type,op_job_idemployees.job_id%type,op_salaryem

59、ployees.salary%type)oASoBEGINnINSERTINTOEmployeesVALUES(EMPLOYEES_SEQ.nextval,p_first_name,p_last_name,p_email,p_phone_number,SYSDATE,p_job_id,p_salary,.30,100,80);nENDinsert_employee;oJava代码见下一页例6、一个实现数据插入的存储过程及其调用opublicStringaddEmployeeSP(Stringfirst_name,Stringlast_name,Stringemail,Stringphone_n

60、umber,Stringjob_id,intsalary)throwsSQLExceptionntryogetDBConnection();osqlString=beginhr.insert_employee(?,?,?,?,?,?);end;oCallableStatementcallstmt=conn.prepareCall(sqlString);ocallstmt.setString(1,first_name);callstmt.setString(2,last_name);ocallstmt.setString(3,email);callstmt.setString(4,phone_n

61、umber);ocallstmt.setString(5,job_id);callstmt.setInt(6,salary);oSystem.out.println(nInsertingwithstoredprocedure:+sqlString);ocallstmt.execute();returnsuccess;ncatch(SQLExceptionex)oSystem.out.println(Possiblesourceoferror:Makesureyouhavecreatedthestoredprocedure);ologException(ex);oreturnfailure;oo

62、SQLException类ngetMessage()o对于原产于JDBC驱动程序的错误,这个方法返回错误信息,没有前缀。在RDBMS的错误,它返回的错误信息与相应的ORA编号的前缀。ngetErrorCode()o返回5位的ORA错误代码ngetSQLState()o对于原产于JDBC驱动程序的错误,这个方法返回无意义信息。对于在RDBMS的错误,这个方法返回一个五位数的代码,以显示SQL状态。使用这个方法注意处理null数据。错误处理九、结果集元数据o透过oracle.jdbc.OracleResultSetMetaData接口可获取如下方法nintgetColumnCount():列数nI

63、ntgetColumnDisplaySize(intcolumn):指定列的最大标准宽度,以字符为单位。nStringgetColumnLabel(intcolumn):用于显示的列标题。nStringgetColumnName(intcolumn)nintgetColumnType(intcolumn):指定列的SQL类型。nStringgetColumnTypeName(intcolumn):指定列特定于数据库的类型。nInt isNullable(intcolumn):指定列的值是否可以为null,返回值为columnNoNulls、columnNullable或columnNullab

64、leUnknown。oDatabaseMetaDatadbmd=conn.getMetaData();oResultSetrset=dbmd.getTables(,SCOTT,EMP,null);owhile(rset.next()ooOracleResultSetMetaDataorsmd=(OracleResultSet)rset).getMetaData();ointnumColumns=orsmd.getColumnCount();oSystem.out.println(Numofcolumns=+numColumns);ofor(inti=0;inumColumns;i+)ooSys

65、tem.out.print(ColumnName=+orsmd.getColumnName(i+1);oSystem.out.print(Type=+orsmd.getColumnType(i+1);oSystem.out.println(TypeName=+orsmd.getColumnTypeName(i+1);oooTheprogramreturnsthefollowingoutput:oNumofcolumns=5oColumnName=TABLE_CATType=12TypeName=VARCHAR2oColumnName=TABLE_SCHEMType=12TypeName=VAR

66、CHAR2oColumnName=TABLE_NAMEType=12TypeName=VARCHAR2oColumnName=TABLE_TYPEType=12TypeName=VARCHAR2oColumnName=TABLE_REMARKSType=12TypeName=VARCHAR2十、处理Unicode编码列o缺省情况下,oracle.jdbc.OraclePreparedStatement的setString方法传入char数据,如果要传入nchar、nvarchar2、nclob类型列数据,需要先调用setFormOfUse()方法。nPreparedStatementpstmt

67、=conn.prepareStatement(insertintoTESTvalues(?,?,?);npstmt.setInt(1,1);/NUMBERcolumnnPstmt.setFormOfUse(2,OraclePreparedStatement.FORM_NCHAR)npstmt.setString(2,myUnicodeString1);/NVARCHAR2columnnPstmt.setFormOfUse(3,OraclePreparedStatement.FORM_NCHAR)npstmt.setString(3,myUnicodeString2);/NCHARcolumnn

68、pstmt.execute();ojava.sql.ResultSetngetString()、getUnicodeStream()returnvaluesfromthedatabaseasJavastringsandasastreamofUnicodecharacters.ooracle.sql.CLOBngetCharacterStream()returnsthecontentsofaCLOBasaUnicodestream.ooracle.sql.CHARngetString():ThisconvertsthesequenceofcharactersrepresentedbytheCHA

69、RobjecttoastringandreturnsaJavaStringobject.ntoString():同getString(),butifthecharactersetisnotrecognized,thentoString()返回CHAR数据的十六进制表示.ngetStringWithReplacement():同getString(),exceptcharactersthathavenoUnicoderepresentationinthecharactersetofthisCHARobjectarereplacedbyadefaultreplacementcharacter.十一

70、、基于LOB定位器获取大对象数据oFirst,selecttheLOBlocatorsintoastandardresultset,thengettheLOBdataintoappropriateJavaclasses:n/SelectLOBlocatorintostandardresultset.nResultSetrs=stmt.executeQuery(SELECTblob_col,clob_colFROMlob_table);nwhile(rs.next()nn/GetLOBlocatorsintoJavawrapperclasses.njava.sql.Blobblob=(java.

71、sql.Blob)rs.getObject(1);njava.sql.Clobclob=(java.sql.Clob)rs.getObject(2);n(.process.)n/GetLOBlocatorsintoJavawrapperclasses.noracle.sql.BLOBblob=(BLOB)rs.getObject(1);noracle.sql.CLOBclob=(CLOB)rs.getObject(2);n(.process.)no从BLOB对象读数据:使用Blob的getBinaryStream()方法获取一个输入流,然后用read()方法读取数据,用close()方法关闭流

72、。o从CLOB对象读取数据,使用Clob的getAsciiStream()或者getCharacterStream()方法,前者获取一个ASCII输入流,后者获取一个Unicode输入流,然后使用read()/close()方法完成操作。n/ReadBLOBdatafromBLOBlocator.nInputStreambyte_stream=my_blob.getBinaryStream(1L);nbytebyte_array=newbyte10;nintbytes_read=byte_stream.read(byte_array);十二、基于LOB定位器向大对象写入数据oExample:P

73、assingaBLOBLocatortoaPreparedStatementIfyouhaveanoOraclePreparedStatementobjectopsandaBLOBnamedmy_blob,thenwriteotheBLOBtothedatabaseasfollows:oOraclePreparedStatementops=(OraclePreparedStatement)conn.prepareStatemento(INSERTINTOblob_tableVALUES(?);oops.setBLOB(1,my_blob);oops.execute();oExample:Pas

74、singaCLOBLocatortoaCallableStatementIfyouhaveanoOracleCallableStatementobjectocsandaCLOBnamedmy_clob,theninputotheCLOBtothestoredprocedureprocasfollows:oOracleCallableStatementocs=o(OracleCallableStatement)conn.prepareCall(callproc(?);oocs.setClob(1,my_clob);oocs.execute();oTowritetoaBLOB,usethesetB

75、inaryStream()methodofanoracle.sql.BLOBobjecttoretrievetheBLOBasanoutputstream.Thisreturnsajava.io.OutputStreamobjecttobewrittenbacktotheBLOB.AswithanyOutputStreamobject,useoneoftheoverloadedwrite()methodstoupdatetheLOBdata,andusetheclose()methodwhenyoufinish.oTowritetoaCLOB,usethesetAsciiStream()ors

76、etCharacterStream()methodofanoracle.sql.CLOBobjecttoretrievetheCLOBasanoutputstreamtobewrittenbacktotheCLOB.ThesetAsciiStream()methodreturnsanASCIIoutputstreaminajava.io.OutputStreamobject.ThesetCharacterStream()methodreturnsaUnicodeoutputstreaminajava.io.Writerobject.AswithanyStreamorWriterobject,u

77、seoneoftheoverloadedwrite()methodstoupdatetheLOBdata,andusetheflush()andclose()methodswhenyoufinish.实验代码测试作业o1.JDBC由哪几部分组成?各有什么作用?JDBC驱动程序分为哪四类?o2.基于JDBC访问数据库,一般分为哪几步?试用UML的顺序图描述基于JDBC驱动访问(查询)数据库的过程。o3.举例说明JDBC-ODBC桥的使用方法。o4.举例说明Oracel公司的Thin驱动程序的用法。o5. 总结基于JDBC调用存储过程/存储函数的方法(请考虑存储过程/存储函数的不同类型)o6.查阅资料,下载并安装Apache tomcat 6.029,尝试Tomcat数据源的配置及其使用o7.阅读Netbean资料,快速掌握NetBean的用法。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号