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

下载本文档

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

文档简介

江苏大学计算机学院 Version 2.0,第17章 使用JDBC的高级特征创建应用程序,Page 2,使用 PreparedStatement 对象创建应用程序 管理数据库事务 执行批量更新 在 JDBC 中创建并调用存储过程 在 JDBC 中使用元数据,目标,Page 3,PreparedStatement 接口是从 Statement 接口派生的,并且在 java.sql 包中。 PreparedStatement 对象: 使您能够将运行时参数传递给 SQL 语句以查询和修改表中的数据。 由 JDBC 编译并准备一次。以后调用 PreparedStatement 对象不会重新编译 SQL 语句。 帮助减少数据库服务器上的负载,因此提高了应用程序的性能。,使用 PreparedStatement对象查询并修改数据,Page 4,PreparedStatement 接口继承以下方法,从 Statement 接口执行 SQL 语句: 使您能够将运行时参数传递给 SQL 语句以查询和修改表中的数据。 int executeUpdate():执行 SQL 语句、INSERT、UPDATE或 DELETE 并返回受影响的行数。 boolean execute():执行 SQL 语句并返回布尔值。,PreparedStatement 接口的方法,Page 5,Connection 对象的 prepareStatement() 方法用于将参数化的查询提交给数据库。 SQL 语句能够使用 ? 符号作为占位符,在运行时由输入参数来替代。例如: stat=con.prepareStatement(“SELECT * FROM score WHERE number = ?“);,PreparedStatement 接口的方法(续),Page 6,每个 ? 参数的值是通过调用适当的 setXXX() 方法设置的,其中 xxx 是参数的数据类型,例如: stat.setString(1,“200306“); ResultSet result=stat.executeQuery();,PreparedStatement 接口的方法(续),Page 7,以下代码段使用PreparedStatement 对象从标题表检索作者编写的书籍: String str = “SELECT * FROM titles WHERE au_id = ?“; PreparedStatement ps= con.prepareStatement(str); ps.setString(1, “1001“); ResultSet rs=ps.executeQuery();,检索行,TestPre.Java,Page 8,以下代码段创建一个PreparedStatement 对象,通过在运行时传递作者的数据在 authors 表中插入一行: String str = “INSERT INTO authors(au_id, au_fname, au_lname) VALUES (?, ?, ?)“; PreparedStatement ps = con.prepareStatement(str); ps.setString(1, “1001“); ps.setString(2, “Abraham“); ps.setString(3, “White“); int rt=ps.executeUpdate();,插入行,TestDML3.java,Page 9,以下代码段使用 PreparedStatement 对象将 state 修改成 CA,在 authors 表中,CA 的 city 是 Oakland: String str = “UPDATE authors SET state= ? WHERE city= ? “; PreparedStatement ps = con.prepareStatement(str); ps.setString(1, “CA“); ps.setString(2, “Oakland“); int rt=ps.executeUpdate();,更新和删除行,TestPS.java,Page 10,以下代码段使用 PreparedStatement 对象,从 author 表中作者的姓是 Abraham 开始删除一行: String str = “DELETE FROM authors WHERE au_fname= ? “; PreparedStatement ps = con.prepareStatement(str); ps.setString(1, “Abraham“); int rt=ps.executeUpdate();,更新和删除行(续),Page 11,事务: 是一组一条或多条 SQL 语句,它们作为一个单元执行。 仅当事务中的所有 SQL 语句成功执行后才完成。 维护数据库中数据的一致性。,管理数据库事务,Page 12,JDBC API 为事务管理提供支持。 在JDBC 应用程序中,可以用两种方法提交数据库事务: 隐式:Connection 对象使用自动提交方式隐式地执行 SQL 语句。 显式:自动提交方式设置成 false 以显式地提交事务语句。将自动提交方式设置成 false 的方法调用是 con.setAutoCommit(false);,管理数据库事务(续),Page 13,提交事务: commit() 方法用来反映数据库中事务所作的更改。 rollback() 方法用于撤销最后一次提交操作之后数据库中所作的更改。 您需要显式调用 commit() 和 rollback() 方法。,关联数据库事务(续),TestTransaction.java,Page 14,批量: 是一组更新语句,它们被发送到数据库作为一个单元来执行。 减少应用程序和数据库之间的网络调用。 与单条 SQL 语句相比,它更加有效。,执行批量更新,Page 15,在 JDBC 中执行批量更新: Statement 或 PreparedStatement 接口提供了以下方法来创建和执行批量的 SQL 语句: void addBatch():将 SQL 语句添加到一个批量。 int executeBatch():将批量的 SQL 语句发送到数据库以进行处理并返回已更新的行的总数。. void clearBatch():从批量中除去 SQL 语句。,执行批量更新(续),TestBatch.java,Page 16,当创建了 Statement 对象来执行批量更新时,一个空的数组会与该对象相关联。 多条 SQL 语句可以添加到该空数组以作为一个批量来执行。 在 JDBC 中使用批量更新时,您还需要使用setAutoCommit(false) 禁用自动提交方式。 executeBatch() 方法返回一个整数数组,该数组存储更新计数值。 更新计数是当处理批量中的 SQL 语句时受影响的行的总数。,执行批量更新(续),Page 17,以下代码段创建批量的 SQL 语句: con.setAutoCommit(false); Statement stmt=con.createStatement(); stmt.addBatch(“INSERT INTO product (p_id, p_desc) VALUES (1001, Printer)“); stmt.addBatch(“INSERT INTO product (p_id, p_desc) VALUES (1002, Scanner)“); 批量中的 SQL 语句按照这些语句在批量中出现的顺序执行。 执行批量 SQL 语句的方法调用是: int updcount=state.executeBatch();,执行批量更新(续),Page 18,批量更新中的异常处理: 批量更新操作会抛出两种类型的异常: SQLException BatchUpdateException BatchUpdateException 类是从SQLException 类派生的。,执行批量更新(续),Page 19,访问数据库时如果发生了问题,则 JDBC API 方法 addBatch()或 executeBatch() 会抛出 SQLException。 当批量中的SQL语句由于以下原因不能执行时,会抛出 BatchUpdateException 异常: SQL 语句中有非法变量。 不存在您要从中检索数据的数据库表。 BatchUpdateException 使用更新计数数组来识别抛出异常的 SQL 语句。,执行批量更新(续),Page 20,java.sql 包提供 CallableStatement 接口,它包含各种方法,使你能够从数据库调用存储过程。 CallableStatement 接口是从 PreparedStatement 接口派生的。 创建存储过程:可以在 JDBC 应用程序中使用 CREATE PROCEDURE SQL 语句来创建。 两种类型是: 参数化 非参数化,在 JDBC 中创建和调用存储过程,Page 21,一个参数化的存储过程可以接受一个或多个参数。 存储过程的参数可以是以下任何一种形式: IN:使用该参数可以将自变量传递给存储过程 OUT:使用该参数可以传递存储过程的返回值。 INOUT:组合了 IN 和 OUT 参数的功能。INOUT 参数使您能够将自变量传递给存储过程,也可以使用该参数来存储存储过程的返回值。,在 JDBC 中创建和调用存储过程 (续),Page 22,在 JDBC 中创建和调用存储过程(续),SQL create or replace procedure p (v_a in number,v_b number,v_ret out number,v_temp in out number) is begin if(v_a v_b) then v_ret := v_a; else v_ret := v_b; end if; v_temp := v_temp + 1; end;,Page 23,不使用任何参数调用存储过程: Connection 接口提供 prepareCall() 方法,使用该方法创建 CallableStatement 对象来调用存储过程。 prepareCall() 具有以下三种格式: CallableStatement prepareCall(String str) CallableStatement prepareCall(String str, int resSetType, int resSetConcurrency) CallableStatement prepareCall(String str, int resSetType, int resSetConcurrency, int resSetHoldability) 不使用参数调用存储过程的语法是: call ;,在 JDBC 中创建和调用存储过程 (续),Page 24,使用参数调用存储过程: SQL 转义语法是一种从关系数据库管理系统 (RDBMS) 中调用存储过程的标准方法,并且它独立于 RDBMS。 有两种格式的 SQL 转义语法,一个包含结果参数,另一个不包含。 SQL 转义语法的语法是: ? = call , ., ,在 JDBC 中创建和调用存储过程 (续),Page 25,占位符用来表示过程调用中存储过程的 IN、OUT 和 INOUT 参数。 使用参数调用存储过程的语法是: call (?) ; 执行 CallableStatement 对象之前,要使用设置方法设置 IN 参数的值。 设置 IN 参数值的语法是: .setInt();,在 JDBC 中创建和调用存储过程 (续),Page 26,如果存储过程包含 OUT 和 INOUT 参数,则这些参数应该与相应的 JDBC 类型一起注册。 registerOut() 方法用来注册这些参数。 registerOut() 方法的原型是: registerOut(int index, int stype) registerOut(int index, int stype, int scale),在 JDBC 中创建和调用存储过程 (续),Page 27,例子,public class TestProc public static void main(String args) throws Exception Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver“); Connection conn = DriverManager.getConnection(“jdbc:odbc:sun“,“,“); CallableStatement cstmt = conn.prepareCall(“call p(?, ?, ?, ?)“); 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(); ,Page 28,元数据是有关数据的信息,如表的结构和属性。 Employee 表的元数据包括以下信息: 列名。 每列的数据类型。 约束在表列中输入数据值。 JDBC API 提供以下两个元数据接口以检索有关数据库和结果集的信息: DatabaseMetaData 接口 ResultSetMetaData 接口,在 JDBC 中使用元数据,Page 29,使用 DatabaseMetaData 接口: DatabaseMetaData 接口提供一些方法,使您能够确定数据库或 RDBMS 的属性。 使用 Connection 接口的 getMetaData() 方法创建DatabaseMetaData 的对象。 创建 DatabaseMetaData 接口的对象的方法调用是: DatabaseMetaData dm=con.getMetaData();,在 JDBC 中使用元数据(续),Page 30,下表列出一些常用的 DatabaseMetaData 接口的方法:,在 JDBC 中使用元数据(续),Page 31,DatabaseMetaData 接口的方法(续):,在 JDBC 中使用元数据(续),Page 32,使用 ReultSetMetaData 接口: ReultSetMetaData 接口包含各种方法,使您能够在结果集中检索有关数据的信息。 ResultSet 接口提供 getMetaData() 方法来创建 ResultSetMetaData 接口的对象。 创建 ResultSetMetaData 接口的方法调用是: ResultSetMetaData rm=rs.getMetaData();,在 JDBC 中使用元数据(续),Page 33,下表列出 ResultSetMetaData 接口的常用方法:,在 JDBC 中使用元数据(续),Page 34,ResultSetMetaData 接口的方法(续):,在 JDBC 中使用元数据(续),Page 35,ResultSetMetaData 接口的方法(续):,在 JDBC 中使用元数据(续),Page 36,在本节课中,您学习了: Connection 接口的 PreparedStatement 对象使您能够使用占位符将运行时参数传递给 SQL 语句。 在单个 SQL 语句中可以有多个占位符。根据 SQL 语句中占位符的位置,索引值与每个占位符相关联。 占位符存储分配给它的值,直到该值被明确更改了。 事务是作为一个单元执行的一条或多条 SQL 语句的集合。仅当事务中的所有 SQL 语句成功执行后事务才完成。,小结,Page 37,如果 setAutoCommit() 方法设置成 true,则在数据库中自动提交 SQL 语句执行的数据库操作。 commit() 方法反映数据库中由 SQL 语句所作的永久更改。 rollback() 方法用于撤销最后一次提交操作之后执行的所有 SQL 操作的影响。 批量是一组发送到数据库作为一个单元执行的更新语句。 使用同一个 Connection 对象将批量作为单个请求发送到数据库。 executeB

温馨提示

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

评论

0/150

提交评论