JAVA学习-第17章使用JDBC的高级特征创建应用程序_第1页
JAVA学习-第17章使用JDBC的高级特征创建应用程序_第2页
JAVA学习-第17章使用JDBC的高级特征创建应用程序_第3页
JAVA学习-第17章使用JDBC的高级特征创建应用程序_第4页
JAVA学习-第17章使用JDBC的高级特征创建应用程序_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

江苏大学计算机学院Version2.0第17章使用JDBC的高级特征创建应用程序1JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第1页!使用PreparedStatement

对象创建应用程序管理数据库事务执行批量更新在JDBC中创建并调用存储过程在JDBC中使用元数据目标2JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第2页!PreparedStatement接口是从Statement接口派生的,并且在java.sql包中。PreparedStatement对象:使您能够将运行时参数传递给SQL语句以查询和修改表中的数据。由JDBC编译并准备一次。以后调用PreparedStatement对象不会重新编译SQL语句。帮助减少数据库服务器上的负载,因此提高了应用程序的性能。

使用PreparedStatement对象查询并修改数据3JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第3页!Connection对象的prepareStatement()方法用于将参数化的查询提交给数据库。SQL语句能够使用‘?’符号作为占位符,在运行时由输入参数来替代。例如:

stat=con.prepareStatement("SELECT*FROMscoreWHEREnumber=?");

PreparedStatement接口的方法(续)4JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第4页!以下代码段使用PreparedStatement对象从标题表检索作者编写的书籍:

Stringstr="SELECT*FROMtitlesWHEREau_id=?";PreparedStatementps=con.prepareStatement(str);ps.setString(1,"1001");ResultSetrs=ps.executeQuery();

检索行TestPre.Java5JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第5页!以下代码段使用PreparedStatement对象将state修改成CA,在authors表中,CA的city是Oakland:Stringstr="UPDATEauthorsSETstate=?WHEREcity=?";PreparedStatementps=con.prepareStatement(str);ps.setString(1,"CA");ps.setString(2,"Oakland");intrt=ps.executeUpdate();更新和删除行TestPS.java6JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第6页!事务:是一组一条或多条SQL语句,它们作为一个单元执行。仅当事务中的所有SQL语句成功执行后才完成。维护数据库中数据的一致性。管理数据库事务7JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第7页!提交事务:mit()方法用来反映数据库中事务所作的更改。rollback()方法用于撤销最后一次提交操作之后数据库中所作的更改。您需要显式调用mit()和rollback()方法。关联数据库事务(续)TestTransaction.java8JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第8页!在JDBC中执行批量更新:Statement或PreparedStatement接口提供了以下方法来创建和执行批量的SQL语句:voidaddBatch():将SQL语句添加到一个批量。intexecuteBatch():将批量的SQL语句发送到数据库以进行处理并返回已更新的行的总数。.voidclearBatch():从批量中除去SQL语句。执行批量更新(续)TestBatch.java9JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第9页!以下代码段创建批量的SQL语句:con.setAutoCommit(false);Statementstmt=con.createStatement(); stmt.addBatch("INSERTINTOproduct(p_id,p_desc)VALUES(1001,'Printer')"); stmt.addBatch("INSERTINTOproduct(p_id,p_desc)VALUES(1002,'Scanner')");

批量中的SQL语句按照这些语句在批量中出现的顺序执行。执行批量SQL语句的方法调用是:

int[]updcount=state.executeBatch();执行批量更新(续)10JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第10页!访问数据库时如果发生了问题,则JDBCAPI方法addBatch()或executeBatch()会抛出SQLException。当批量中的SQL语句由于以下原因不能执行时,会抛出BatchUpdateException异常:SQL语句中有非法变量。不存在您要从中检索数据的数据库表。BatchUpdateException使用更新计数数组来识别抛出异常的SQL语句。执行批量更新(续)11JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第11页!一个参数化的存储过程可以接受一个或多个参数。存储过程的参数可以是以下任何一种形式:IN:使用该参数可以将自变量传递给存储过程OUT:使用该参数可以传递存储过程的返回值。INOUT:组合了IN和OUT参数的功能。INOUT参数使您能够将自变量传递给存储过程,也可以使用该参数来存储存储过程的返回值。在JDBC中创建和调用存储过程(续)12JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第12页!不使用任何参数调用存储过程:Connection接口提供prepareCall()方法,使用该方法创建CallableStatement对象来调用存储过程。prepareCall()具有以下三种格式:CallableStatementprepareCall(Stringstr)CallableStatementprepareCall(Stringstr,intresSetType,intresSetConcurrency)CallableStatementprepareCall(Stringstr,intresSetType,intresSetConcurrency,intresSetHoldability)

不使用参数调用存储过程的语法是:

{call<procedure_name>};

在JDBC中创建和调用存储过程(续)13JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第13页!占位符用来表示过程调用中存储过程的IN、OUT和INOUT参数。使用参数调用存储过程的语法是:{call<procedure_name>(?)};执行CallableStatement对象之前,要使用设置方法设置IN参数的值。设置IN参数值的语法是:

<CallableStatement_object>.setInt(<value>);在JDBC中创建和调用存储过程(续)14JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第14页!例子publicclassTestProc{publicstaticvoidmain(String[]args)throwsException{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connectionconn=DriverManager.getConnection("jdbc:odbc:sun","",""); CallableStatementcstmt=conn.prepareCall("{callp(?,?,?,?)}"); cstmt.registerOutParameter(3,Types.INTEGER); cstmt.registerOutParameter(4,Types.INTEGER); cstmt.setInt(1,3); cstmt.setInt(2,4); cstmt.setInt(4,5); cstmt.execute(); System.out.println(cstmt.getInt(3)); System.out.println(cstmt.getInt(4)); cstmt.close(); conn.close();}}15JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第15页!使用DatabaseMetaData接口:DatabaseMetaData接口提供一些方法,使您能够确定数据库或RDBMS的属性。使用Connection接口的getMetaData()方法创建DatabaseMetaData的对象。创建DatabaseMetaData接口的对象的方法调用是:DatabaseMetaDatadm=con.getMetaData();在JDBC中使用元数据(续)16JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第16页!DatabaseMetaData接口的方法(续):方法描述ResultSetgetPrimaryKeys(Stringcatalog,Stringschema,Stringtable)获取有关数据库表的主键信息。String

getURL()获取数据库的URL。booleanisReadOnly()返回布尔值,表明数据库是否是只读的。booleansupportsSavepoints()返回布尔值,表明数据库是否支持savepoints.在JDBC中使用元数据(续)17JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第17页!下表列出ResultSetMetaData接口的常用方法:方法描述intgetColumnCount()返回一个整数值,表明ResultSet对象的列总数。StringgetColumnLabel(intcolumn_index)获取表列的标题,该列与作为参数传递给该方法的索引相对应。StringgetColumnName(intcolumn_index)获取与作为参数传递给该方法的索引相对应的表列的名称。intgetColumnType(intcolumn_index)获取与作为参数传递的索引相对应的SQL数据类型的表列。在JDBC中使用元数据(续)18JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第18页!ResultSetMetaData接口的方法(续):方法描述booleanisReadOnly(intcolumn_index)返回一个布尔值,表明ResultSet中与作为参数而传递的索引相对应的列是否是只读的。booleanisWritable(intcolumn_index)返回一个布尔值,表明与作为参数而传递的索引相对应的ResultSet列是否是可更新的。在JDBC中使用元数据(续)19JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第19页!如果setAutoCommit()方法设置成true,则在数据库中自动提交SQL语句执行的数据库操作。mit()方法反映数据库中由SQL语句所作的永久更改。rollback()方法用于撤销最后一次提交操作之后执行的所有SQL操作的影响。

批量是一组发送到数据库作为一个单元执行的更新语句。使用同一个Connection对象将批量作为单个请求发送到数据库。executeBatch()方法返回一个整数数组,该数组存储批量中成功执行的所有SQL语句的更新计数。更新计数是受每个SQL语句执行的数据库操作影响的数据库的行数。小结(续)20JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第20页!存储过程的参数可以有三种形式:IN:将参数传递到存储过程OUT:传递存储过程的返回值。INOUT:使您能够将参数传递到存储过程。也可以用来传递存储过程的返回值。元数据是有关数据的信息,如表的结构和属性。JDBCAPI提供两种元数据接口来检索有关数据库和结果集DatabaseMetaData和ResultSetMetaData的信息。

DatabaseMetaData接口声明一些方法,这些方法使您能够确定数据库或RDBMS的属性。小结(续)21JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第21页!PreparedStatement接口继承以下方法,从Statement接口执行SQL语句:使您能够将运行时参数传递给SQL语句以查询和修改表中的数据。intexecuteUpdate():执行SQL语句、INSERT、UPDATE或DELETE并返回受影响的行数。booleanexecute():执行SQL语句并返回布尔值。

PreparedStatement接口的方法22JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第22页!每个‘?’参数的值是通过调用适当的setXXX()方法设置的,其中xxx是参数的数据类型,例如:

stat.setString(1,“200306");ResultSetresult=stat.executeQuery();

PreparedStatement接口的方法(续)23JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第23页!以下代码段创建一个PreparedStatement对象,通过在运行时传递作者的数据在authors表中插入一行:

Stringstr="INSERTINTOauthors(au_id,au_fname,au_lname)VALUES(?, ?,?)";PreparedStatementps=con.prepareStatement(str);ps.setString(1,"1001");ps.setString(2,"Abraham");ps.setString(3,"White");intrt=ps.executeUpdate();插入行TestDML3.java24JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第24页!以下代码段使用PreparedStatement对象,从author表中作者的姓是Abraham开始删除一行:Stringstr="DELETEFROMauthorsWHEREau_fname=?";PreparedStatementps=con.prepareStatement(str);ps.setString(1,"Abraham");intrt=ps.executeUpdate();

更新和删除行(续)25JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第25页!JDBCAPI为事务管理提供支持。在JDBC应用程序中,可以用两种方法提交数据库事务:隐式:Connection对象使用自动提交方式隐式地执行SQL语句。显式:自动提交方式设置成false以显式地提交事务语句。将自动提交方式设置成false的方法调用是

con.setAutoCommit(false);管理数据库事务(续)26JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第26页!批量:是一组更新语句,它们被发送到数据库作为一个单元来执行。减少应用程序和数据库之间的网络调用。与单条SQL语句相比,它更加有效。执行批量更新27JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第27页!当创建了Statement对象来执行批量更新时,一个空的数组会与该对象相关联。多条SQL语句可以添加到该空数组以作为一个批量来执行。在JDBC中使用批量更新时,您还需要使用setAutoCommit(false)禁用自动提交方式。executeBatch()方法返回一个整数数组,该数组存储更新计数值。更新计数是当处理批量中的SQL语句时受影响的行的总数。执行批量更新(续)28JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第28页!批量更新中的异常处理:批量更新操作会抛出两种类型的异常:SQLExceptionBatchUpdateExceptionBatchUpdateException类是从SQLException类派生的。

执行批量更新(续)29JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第29页!java.sql包提供CallableStatement接口,它包含各种方法,使你能够从数据库调用存储过程。CallableStatement接口是从PreparedStatement接口派生的。创建存储过程:可以在JDBC应用程序中使用CREATEPROCEDURESQL语句来创建。两种类型是:参数化非参数化在JDBC中创建和调用存储过程30JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第30页!在JDBC中创建和调用存储过程(续)SQL>createorreplaceprocedurep

(v_ainnumber,v_bnumber,v_retoutnumber,v_tempinoutnumber)

is

begin

if(v_a>v_b)then

v_ret:=v_a;

else

v_ret:=v_b;

endif;

v_temp:=v_temp+1;

end;31JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第31页!使用参数调用存储过程:SQL转义语法是一种从关系数据库管理系统(RDBMS)中调用存储过程的标准方法,并且它独立于RDBMS。有两种格式的SQL转义语法,一个包含结果参数,另一个不包含。SQL转义语法的语法是:{[?=]call<procedure_name>[<parameter1>,<parameter2>,...,<parameterN>]}

在JDBC中创建和调用存储过程(续)32JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第32页!如果存储过程包含OUT和INOUT参数,则这些参数应该与相应的JDBC类型一起注册。registerOut()方法用来注册这些参数。registerOut()方法的原型是:registerOut(intindex,intstype)registerOut(intindex,intstype,intscale)

在JDBC中创建和调用存储过程(续)33JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第33页!元数据是有关数据的信息,如表的结构和属性。Employee表的元数据包括以下信息:列名。每列的数据类型。约束在表列中输入数据值。JDBCAPI提供以下两个元数据接口以检索有关数据库和结果集的信息:DatabaseMetaData接口ResultSetMetaData接口

在JDBC中使用元数据34JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第34页!下表列出一些常用的DatabaseMetaData接口的方法:方法描述ResultSetgetColumns(Stringcatalog,Stringschema,Stringtable_name,Stringcolumn_name)检索有关数据库表的列的信息,该数据库表在指定的分类中。ConnectiongetConnection()获取创建DatabaseMetaData对象的数据库连接。StringgetDriverName()获取DatabaseMetaData对象的JDBC驱动程序的名称。StringgetDriverVersion()获取JDBC驱动程序的版本。在JDBC中使用元数据(续)35JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第35页!使用ReultSetMetaData接口:ReultSetMetaData接口包含各种方法,使您能够在结果集中检索有关数据的信息。ResultSet接口提供getMetaData()方法来创建ResultSetMetaData接口的对象。创建ResultSetMetaData接口的方法调用是:ResultSetMetaDatarm=rs.getMetaData();

在JDBC中使用元数据(续)36JAVA学习--第17章使用JDBC的高级特征创建应用程序共40页,您现在浏览的是第36页!ResultSetMetaData接口的方法(续):方法描述

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论