《网络数据库--jdbc高级应用》由会员分享,可在线阅读,更多相关《网络数据库--jdbc高级应用(14页珍藏版)》请在金锄头文库上搜索。
1、第七部分第三篇 JDBC高级应用,本章主要内容有 程序操作预编译 事务管理 存储过程,7.1 程序操作预编译,我们想对查询执行1000次,用预编译语句处理,写成如下的形式: PreparedStatement prepStmt= con.prepareStatement(“SELECT COF_NAME, PRICE FROM COFFEES“); ResultSet rs; for(int i=0;i1000;i+) rs = prepStmt.executeQuery();,7.1 程序操作预编译,SELECT COF_NAME, SUP_ID FROM COFFEES WHERE COF
2、_NAME LIKE Colombian; SELECT COF_NAME, SUP_ID FROM COFFEES WHERE COF_NAME LIKE French_Roast ; SELECT COF_NAME, SUP_ID FROM COFFEES WHERE COF_NAME LIKE Espresso ; 我们可以为一类查询设计一个模板,形式如下: SELECT COF_NAME, SUP_ID FROM COFFEES WHERE COF_NAME LIKE ?,7.1 程序操作预编译,把上面的三条查询代码重新改写如下: PreparedStatement prepStmt=
3、Con.prepareStatement(“SELECT COF_NAME, SUP_ID FROM COFFEES “+“WHERE COF_NAME LIKE ?“); prepStmtsetString(1,“Colombian“); prepStmtsetString(1,“French_Roast“); prepStmtsetString(1,“Espresso“); ResultSet rs=prepStmt.executeQuery();,7.1 程序操作预编译,如果LIKE子句有大量的值需要绑定,参数的值可以事先存储在一个数组中,通过I/O流机制实现数据的输入和输出。 Prep
4、aredStatement prepStmt=Con.prepareStatement(“SELECT COF_NAME, SUP_ID FROM COFFEES “+“WHERE COF_NAME LIKE ?“); String coffees=“Colombian“,“French_Roast“,“Espresso“; int len=coffees.length; for(int i=0;ilen;i+) prepStmtsetString(1,coffeesi); ResultSet rs=prepStmt.executeQuery();,7.2 事务管理,怎样在编程中实现对事务的管
5、理呢?首先我们没有必要显示地启动一个事务,可以通过调用Connection.setAutoCommit(false)隐式地实现。然后调用Cmit()方法来提交一个事务,而且如果考虑到代码的安全性,还要包括一个回滚Connection.rollback()。 例如下面的这段代码:,7.2 事务管理,con.setAutoCommit(false); PreparedStatement updateSales = con.prepareStatement(“UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ?“); updateSales.setIn
6、t(1, 50); updateSales.setString(2, “Colombian“); updateSales.executeUpdate(); PreparedStatement updateTotal = con.prepareStatement(“UPDATE COFFEES SET TOTAL = TOTAL + ? WHERE COF_NAME LIKE ?“); updateTotal.setInt(1, 50); updateTotal.setString(2, “Colombian“); updateTotal.executeUpdate(); mit(); con.
7、setAutoCommit(true);,7.3 存储过程,创建一个存储过程 create procedure SHOW_SUPPLIERS as select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME from SUPPLIERS, COFFEES where SUPPLIERS.SUP_ID = COFFEES.SUP_ID order by SUP_NAME,7.3 存储过程,将上面的SQL语言串保存在一个String变量中,以便后续使用。 String createProcedure = “create procedure SHOW_SUPPLIERS
8、“ +“as “ +“select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME “ +“from SUPPLIERS, COFFEES “ +“where SUPPLIERS.SUP_ID = COFFEES.SUP_ID “ +“order by SUP_NAME“;,7.3 存储过程,创建一个Statement连接,并运行这个SQL语句串。 Statement stmt = con.createStatement(); stmt.executeUpdate(createProcedure);,7.3 存储过程,JDBC允许用户在应用程序中调用存储过程。首先需要
9、创建一个CallableStatement对象。CallableStatement对象包含一个存储过程调用,而不是包含存储过程本身,存储过程调用要写在中,并用“”引起来。,7.3 存储过程,CallableStatement cs = con.prepareCall(“call SHOW_SUPPLIERS“); ResultSet rs = cs.executeQuery();,7.3 存储过程,程序执行得到的结果集可能如同下面的形式: SUP_NAME COF_NAME - - Acme, Inc. Colombian Acme, Inc. Colombian_Decaf Superior Coffee French_Roast Superior Coffee French_Roast_Decaf The High Ground Espresso,7.3 存储过程,上面的代码中执行cs的方法调用的是executeQuery()方法,这是因为cs调用的存储过程包含了一个查询语句而且只生成一个结果集。如果存储过程中包含的是更新语句或DDL语句,则需要用executeUpdate()方法来调用。,