资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第七部分第三篇,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_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,=,Con.,prepareStatement,(SELECT COF_NAME,SUP_ID FROM COFFEES+,WHERE COF_NAME LIKE?);,prepStmt.setString(1,Colombian);,prepStmt.setString(1,French_Roast);,prepStmt.setString(1,Espresso);,ResultSet,rs,=,prepStmt,.,executeQuery,();,7.,1,程序操作预编译,如果,LIKE,子句有大量的值需要绑定,参数的值可以事先存储在一个数组中,通过,I/O,流机制实现数据的输入和输出。,PreparedStatement,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;i,len,;i+),prepStmt.setString(1,coffeesi);,ResultSet,rs,=,prepStmt,.,executeQuery,();,7.,2,事务管理,怎样在编程中实现对事务的管理呢?首先我们没有必要显示地启动一个事务,可以通过调用,Connection.,setAutoCommit,(false),隐式地实现。然后调用,Cmit(),方法来提交一个事务,而且如果考虑到代码的安全性,还要包括一个回滚,Connection.rollback()。,例如下面的这段代码:,7.,2,事务管理,con.,setAutoCommit,(false);,PreparedStatement,updateSales,=con.,prepareStatement,(,UPDATE COFFEES SET SALES=?WHERE COF_NAME LIKE?);,updateSales.setInt(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.,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 +,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,允许用户在应用程序中调用存储过程。首先需要创建一个,CallableStatement,对象。,CallableStatement,对象包含一个存储过程调用,而不是包含存储过程本身,存储过程调用要写在,中,并用“”引起来。,7.,3,存储过程,CallableStatement,cs,=con.,prepareCall,(call SHOW_SUPPLIERS);,ResultSet,rs,=,cs,.,executeQuery,();,7.,3,存储过程,程序执行得到的结果集可能如同下面的形式:,SUP_NAMECOF_NAME,-,Acme,Inc.Colombian,Acme,Inc.Colombian_Decaf,Superior CoffeeFrench_Roast,Superior CoffeeFrench_Roast_Decaf,The High GroundEspresso,7.,3,存储过程,上面的代码中执行,cs,的方法调用的是,executeQuery,(),方法,这是因为,cs,调用的存储过程包含了一个查询语句而且只生成一个结果集。如果存储过程中包含的是更新语句或,DDL,语句,则需要用,executeUpdate,(),方法来调用。,
展开阅读全文