|
![]() |
名片设计 CorelDRAW Illustrator AuotoCAD Painter 其他软件 Photoshop Fireworks Flash |
|
如何利用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(三) |
![]() ![]() |
快精灵印艺坊 版权所有 |
首页![]() ![]() ![]() ![]() ![]() ![]() ![]() |