《JAVA学习--第17章使用JDBC的高级特征创建应用程序资料讲解》由会员分享,可在线阅读,更多相关《JAVA学习--第17章使用JDBC的高级特征创建应用程序资料讲解(40页珍藏版)》请在金锄头文库上搜索。
1、江苏大学计算机学院 Version 2.0,第17章 使用JDBC的高级特征创建应用程序,Page 2,使用 PreparedStatement 对象创建应用程序 管理数据库事务 执行批量更新 在 JDBC 中创建并调用存储过程 在 JDBC 中使用元数据,目标,Page 3,PreparedStatement 接口是从 Statement 接口派生的,并且在 java.sql 包中。 PreparedStatement 对象: 使您能够将运行时参数传递给 SQL 语句以查询和修改表中的数据。 由 JDBC 编译并准备一次。以后调用 PreparedStatement 对象不会重新编译 SQL
2、 语句。 帮助减少数据库服务器上的负载,因此提高了应用程序的性能。,使用 PreparedStatement对象查询并修改数据,Page 5,Connection 对象的 prepareStatement() 方法用于将参数化的查询提交给数据库。 SQL 语句能够使用 ? 符号作为占位符,在运行时由输入参数来替代。例如: stat=con.prepareStatement(SELECT * FROM score WHERE number = ?);,PreparedStatement 接口的方法(续),Page 6,每个 ? 参数的值是通过调用适当的 setXXX() 方法设置的,其中 xxx
3、 是参数的数据类型,例如: 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.execut
4、eQuery();,检索行,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
5、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.executeUpda
6、te();,更新和删除行,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 语句,它们作为一个单元执行。
7、 仅当事务中的所有 SQL 语句成功执行后才完成。 维护数据库中数据的一致性。,管理数据库事务,Page 12,JDBC API 为事务管理提供支持。 在JDBC 应用程序中,可以用两种方法提交数据库事务: 隐式:Connection 对象使用自动提交方式隐式地执行 SQL 语句。 显式:自动提交方式设置成 false 以显式地提交事务语句。将自动提交方式设置成 false 的方法调用是 con.setAutoCommit(false);,管理数据库事务(续),Page 13,提交事务: commit() 方法用来反映数据库中事务所作的更改。 rollback() 方法用于撤销最后一次提交操作
8、之后数据库中所作的更改。 您需要显式调用 commit() 和 rollback() 方法。,关联数据库事务(续),TestTransaction.java,Page 14,批量: 是一组更新语句,它们被发送到数据库作为一个单元来执行。 减少应用程序和数据库之间的网络调用。 与单条 SQL 语句相比,它更加有效。,执行批量更新,Page 15,在 JDBC 中执行批量更新: Statement 或 PreparedStatement 接口提供了以下方法来创建和执行批量的 SQL 语句: void addBatch():将 SQL 语句添加到一个批量。 int executeBatch():将批
9、量的 SQL 语句发送到数据库以进行处理并返回已更新的行的总数。. void clearBatch():从批量中除去 SQL 语句。,执行批量更新(续),TestBatch.java,Page 16,当创建了 Statement 对象来执行批量更新时,一个空的数组会与该对象相关联。 多条 SQL 语句可以添加到该空数组以作为一个批量来执行。 在 JDBC 中使用批量更新时,您还需要使用setAutoCommit(false) 禁用自动提交方式。 executeBatch() 方法返回一个整数数组,该数组存储更新计数值。 更新计数是当处理批量中的 SQL 语句时受影响的行的总数。,执行批量更新(
10、续),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 updcoun
11、t=state.executeBatch();,执行批量更新(续),Page 18,批量更新中的异常处理: 批量更新操作会抛出两种类型的异常: SQLException BatchUpdateException BatchUpdateException 类是从SQLException 类派生的。,执行批量更新(续),Page 19,访问数据库时如果发生了问题,则 JDBC API 方法 addBatch()或 executeBatch() 会抛出 SQLException。 当批量中的SQL语句由于以下原因不能执行时,会抛出 BatchUpdateException 异常: SQL 语句中有非
12、法变量。 不存在您要从中检索数据的数据库表。 BatchUpdateException 使用更新计数数组来识别抛出异常的 SQL 语句。,执行批量更新(续),Page 20,java.sql 包提供 CallableStatement 接口,它包含各种方法,使你能够从数据库调用存储过程。 CallableStatement 接口是从 PreparedStatement 接口派生的。 创建存储过程:可以在 JDBC 应用程序中使用 CREATE PROCEDURE SQL 语句来创建。 两种类型是: 参数化 非参数化,在 JDBC 中创建和调用存储过程,Page 21,一个参数化的存储过程可以接
13、受一个或多个参数。 存储过程的参数可以是以下任何一种形式: 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)isbegin
14、if(v_a v_b) thenv_ret := v_a;elsev_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
15、resSetConcurrency) CallableStatement prepareCall(String str, int resSetType, int resSetConcurrency, int resSetHoldability) 不使用参数调用存储过程的语法是: call ;,在 JDBC 中创建和调用存储过程 (续),Page 24,使用参数调用存储过程: SQL 转义语法是一种从关系数据库管理系统 (RDBMS) 中调用存储过程的标准方法,并且它独立于 RDBMS。 有两种格式的 SQL 转义语法,一个包含结果参数,另一个不包含。 SQL 转义语法的语法是: ? = cal
16、l , ., ,在 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 Ex