快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

全面解析JDBC(四)

如何利用JDBC发送SQL语句?

  Statement对象用于将SQL语句发送到数据库中。实际上有三种Statement对象,它们都作为在给定连接上执行SQL语句的包容器:Statement、PreparedStatement(它从Statement继续而来)和CallableStatement(它从PreparedStatement继续而来)。它们都专用于发送特定类型的SQL语句:Statement对象用于执行不带参数的简朴SQL语句;PreparedStatement对象用于执行带或不带IN参数的预编译SQL语句;CallableStatement对象用于执行对数据库已存储过程的调用。

  Statement接口提供了执行语句和获取结果的基本方式;PreparedStatement接口添加了处理IN参数的方式;而CallableStatement添加了处理OUT参数的方式。

  1. 创建Statement对象

  建立了到特定数据库的连接之后,就可用该连接发送SQL语句。Statement对象用Connection的方式createStatement创建,如下列代码段中所示:

Connection con = DriverManager.getConnection(url,"sunny","");
Statement stmt = con.createStatement();


  为了执行Statement对象,被发送到数据库的SQL语句将被作为参数提供应Statement的方式:

  ResultSet rs = stmt.executeQuery("SELECT a,b,c FROM Table2");

  2. 使用Statement对象执行语句

  Statement接口提供了三种执行SQL语句的方式:executeQuery、executeUpdate和execute。使用哪一个方式由SQL语句所产生的内容决定。

  方式executeQuery用于产生单个结果集的语句,例如SELECT语句。方式executeUpdate用于执行INSERT、UPDATE或DELETE语句以及SQL DDL(数据定义语言)语句,例如CREATE TABLE和DROP TABLE。INSERT、UPDATE或DELETE语句的效果是修改表中零行或多行中的一列或多列。executeUpdate的返回值是一个整数,指示受影响的行数(即更新计数)。对于CREATE TABLE或DROP TABLE等不操作行的语句,executeUpdate的返回值总为零。

  执行语句的所有方式都将关闭所调用的Statement对象的当前打开结果集(假如存在)。这意味着在重新执行Statement对象之前,需要完成对当前ResultSet对象的处理。应注重,继续了Statement接口中所有方式的PreparedStatement接口都有自己的executeQuery、executeUpdate和execute方式。Statement对象本身不包含SQL语句,因而必须给Statement.execute方式提供SQL语句作为参数。PreparedStatement对象并不需要SQL语句作为参数提供应这些方式,因为它们已经包含预编译SQL语句。

  CallableStatement对象继续这些方式的PreparedStatement形式。对于这些方式的PreparedStatement或CallableStatement版本,使用查询参数将抛出SQLException。

  3. 语句完成

  当连接处于自动提交模式时,其中所执行的语句在完成时将自动提交或还原。语句在已执行且所有结果返回时,即认为已完成。对于返回一个结果集的executeQuery方式,在检索完ResultSet对象的所有行时该语句完成。对于方式executeUpdate,当它执行时语句即完成。但在少数调用方式execute的情况中,在检索所有结果集或它生成的更新计数之后语句才完成。

  有些DBMS将已存储过程中的每条语句视为独立的语句;而另外一些则将整个过程视为一个复合语句。在启用自动提交时,这种差别就变得异常重要,因为它影响什么时候调用commit方式。在前一种情况中,每条语句单独提交;在后一种情况中,所有语句同时提交。

  4. 关闭Statement对象

  Statement对象将由Java垃圾收集程序自动关闭。而作为一种好的编程风格,应在不需要Statement对象时显式地关闭它们。这将立刻释放DBMS资源,有助于避免潜在的内存问题。

  5. 使用方式execute

  execute方式应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组合时使用。当执行某个已存储过程或动态执行未知SQL字符串(即应用程序程序员在编译时未知)时,有可能出现多个结果的情况,尽管这种情况很少见。例如,用户可能执行一个已存储过程,并且该已存储过程可执行更新,然后执行选择,再进行更新,再进行选择,等等。通常使用已存储过程的人应知道它所返回的内容。

  因为方式execute处理异常规情况,所以获取其结果需要一些特别处理并不足为怪。例如,假定已知某个过程返回两个结果集,则在使用方式execute执行该过程后,必须调用方式getResultSet获得第一个结果集,然后调用适当的getXXX方式获取其中的值。要获得第二个结果集,需要先调用getMoreResults方式,然后再调用getResultSet方式。假如已知某个过程返回两个更新计数,则首先调用方式getUpdateCount,然后调用getMoreResults,并再次调用getUpdateCount。

  对于不知道返回内容,则情况更为复杂。假如结果是ResultSet对象,则方式execute返回true;假如结果是Javaint,则返回false。假如返回int,则意味着结果是更新计数或执行的语句是DL命令。在调用方式execute之后要做的第一件事情是调用getResultSet或getUpdateCount。调用方式getResultSet可以获得两个或多个ResultSet对象中第一个对象;或调用方式getUpdateCount可以获得两个或多个更新计数中第一个更新计数的内容。

  当SQL语句的结果不是结果集时,则方式getResultSet将返回null。这可能意味着结果是一个更新计数或没有其它结果。在这种情况下,判定null真正含义的唯一方式是调用方式getUpdateCount,它将返回一个整数。这个整数为调用语句所影响的行数;假如为-1则表示结果是结果集或没有结果。假如方式getResultSet已返回null(表示结果不是ResultSet对象),则返回值-1表示没有其它结果。也就是说,当下列条件为真时表示没有结果(或没有其它结果):

  ((stmt.getResultSet()==null)&&(stmt.getUpdateCount()==-1))

  假如已经调用方式getResultSet并处理了它返回的ResultSet对象,则有必要调用方式getMoreResults以确定是否有其它结果集或更新计数。假如getMoreResults返回true,则需要再次调用getResultSet来检索下一个结果集。如上所述,假如getResultSet返回null,则需要调用getUpdateCount来检查null是表示结果为更新计数还是表示没有其它结果。

  当getMoreResults返回false时,它表示该SQL语句返回一个更新计数或没有其它结果。因此需要调用方式getUpdateCount来检查它是哪一种情况。在这种情况下,当下列条件为真时表示没有其它结果:

  ((stmt.getMoreResults()==false)&&(stmt.getUpdateCount()==-1))

  下面的代码演示了一种方式用来确认已访问调用方式execute所产生的全部结果集和更新计数:

stmt.execute(queryStringWithUnknownResults);
while(true){
introwCount=stmt.getUpdateCount();
if(rowCount>0){//它是更新计数
System.out.println("Rows changed="+count);
stmt.getMoreResults();
continue;
}
if(rowCount==0){//DDL命令或0个更新
System.out.println("No rows changed or statement was DDL command");
stmt.getMoreResults();
continue;
}
//执行到这里,证实有一个结果集
//或没有其它结果
ResultSet rs=stmt.getResultSet();
if(rs!=null){
...//使用元数据获得关于结果集列的信息
while(rs.next()){
...//处理结果
stmt.getMoreResults();
continue;
}
break;//没有其它结果
返回类别: 教程
上一教程: JSP计数器代码
下一教程: JAVA基础知识(6)

您可以阅读与"全面解析JDBC(四)"相关的教程:
· 全面解析JDBC(三)
· 全面解析JDBC(五)
· 全面解析JDBC(一)
· 全面解析JDBC(七)
· 全面解析JDBC(八)
    微笑服务 优质保证 索取样品