使用execute()方法¶
当SQL语句执行后会返回多个ResultSet对象、多个更新记录数或ResultSet对象与更新计数的组合时,通常使用execute方法。当同时执行多个SQL语句、执行某个存储过程或动态执行未知SQL字符串(即应用程序程序员在编译时未知)时,就有可能出现多个结果的情况,因此在这种情况下就需要使用execute(),因为execute()方法同时适用于对有ResultSet对象返回和有更新记录数返回的情况。
如果不知道返回结果的类型,则可以通过execute方法的返回值来进行判断。如果结果是ResultSet对象,则方法execute返回true;如果结果类型是更新纪录数,则返回false。如果返回int,则意味着结果是更新记录数或执行的语句是DDL命令。在调用方法execute之后可以调用getResultSet()或getUpdateCount()。其中getResultSet()方法获得当前结果集,而getUpdateCount()获得记录的更新数。
当SQL语句的返回结果不是结果集时,则方法getResultSet将返回null。这可能意味着结果是一个更新记录数或没有其它结果。在这种情况下,判断null真正含义的方法是调用方法getUpdateCount(),它将返回一个整数。这个整数为调用语句所影响的行数;如果为-1则表示结果是结果集或没有结果。如果方法getResultSet已返回null(表示结果不是ResultSet对象),则返回值-1表示没有其它结果。也就是说,当下列条件((stmt.getResultSet()== null)&&(stmt.getUpdateCount()== -1))为真时表示没有结果(或没有其它结果)。
下面给了一个示例,用于执行未知sql语句的情况下作判断:
String sql;
/*
* 对字符串sql进行赋值,可以是单条SQL语句, 也可以是用;分隔的多条SQL语句
*/
sql = "UPDATE TEST "
+"SET value = 'change' WHERE id = 1";;
boolean b;
try {
Statement stmt = con.createStatement();
b = stmt.execute(sql);
if (b == true) {
// 说明返回的是ResultSet对象
ResultSet rs;
rs = stmt.getResultSet();
while (rs.next()) {
//处理
}
} else {
// 说明返回的是更新记录数
int rows = stmt.getUpdateCount();
assertNotEquals(-1, rows);
}
stmt.close();
con.close();
} catch (SQLException e) {
fail(e.getMessage());
}
如果执行方法execute()后得到多个结果集,则需要借助getMoreResults()来获取额外的结果集。execute()方法返回的结果,用于表示第一条SQL语句的执行结果,如果为true就表示有结果集返回,如果为false就表示有记录更新。对于第二条以后的SQL语句的执行结果,则用getMoreResults()方法去获得,同上面一样如果为true就表示有结果集返回,如果为false就表示有记录有更新。最后当(getMoreResults() == false) &&(getUpdateCount() == -1)时表示后面再也没有执行语句返回的结果了。
下面是一个例子,execute()方法的输入参数是多个用分号分隔的SQL语句:
Statement stmt;
boolean retVal;
try {
String sql = "SELECT ID FROM TEST WHERE ID > 0;"
+ "INSERT INTO TEST VALUES(20,'VALUE20');"
+ "SELECT VALUE FROM TEST WHERE ID > 10";
stmt = con.createStatement();
retVal = stmt.execute(sql);
ResultSet rs;
int count;
do {
if (retVal == false) {
// 如果没有结果集
count = stmt.getUpdateCount();
if (count == -1) {
// 说明既没有结果集,也没有更新的记录数,即下面再也没有
// results了,跳出循环
break;
} else {
// 如果有记录被更新
// <some code>
}
} else { // 有结果集返回
rs = stmt.getResultSet();
// 处理ResultSet
}
// 获得下一个结果集或更新的记录数
retVal = stmt.getMoreResults();
} while (true);
} catch (SQLException e) {
fail(e.getMessage());
}