2.2.3 处理多个结果集
execute方法不仅可以执行单条查询语句,而且还可以执行多条查询语句,不同查询语句之间用分号(;)隔开。在给出例子之前,先使用如下SQL建立一个图书销售表t_booksale,并向其中插入三条记录。
建立t_booksale表
DROP TABLE IF EXISTS mydb.t_booksale;
CREATE TABLE mydb.t_booksale (
id int(10) unsigned NOT NULL auto_increment,
bookid int unsigned NOT NULL,
amount int unsigned NOT NULL,
saledate datetime NOT NULL,
PRIMARY KEY (id),
KEY bookid (bookid)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;
向t_booksale表插入三条记录
INSERT INTO mydb.t_booksale(bookid,amount,saledate) values(1, 23, '2007-02-04');
INSERT INTO mydb.t_booksale(bookid,amount,saledate) values(1, 120, '2007-05-16');
INSERT INTO mydb.t_booksale(bookid,amount,saledate) values(2, 218, '2007-06-08');
要想处理所有的结果集,需要使用ResultSet接口的getMoreResults()方法来判断是否存在下一个结果集。getMoreResults()方法的定义如下:
boolean getMoreResults() throws SQLException;
getMoreResults()方法和ResultSet接口的next()方法不同。当execute方法返回多结果集时,当前位置就处于第一个结果集上,因此,应该使用do...while语句将getMoreResults方法作为while的条件,而不能使用while语句来扫描查询结果集。如下面的代码将不能获得第一个结果集:
...
while(stmt.getMoreResults())
{
rs = stmt.getResultSet(); // 只能获得第2个及后面的结果集
}
...
实例 JDBC执行多条查询语句
下面给出一个完整的实例来演示如何使用execute方法返回并处理多个结果集。
1.程序分析说明
在这个程序中,使用execute方法执行两条SELECT语句,这两条SELECT语句分别查询t_books和t_booksale表的所有记录。这两条SELECT语句之间使用分号(;)分隔。
2.代码编写
实例的代码如下:
public class MultiResultSet
{
public static void main(String[] args) throws Exception
{
// 装载mysql驱动
Class.forName("com.mysql.jdbc.Driver");
// 获得Connection对象
Connection conn = DriverManager
.getConnection("jdbc:mysql://localhost/mydb?characterEncoding=UTF8&allowMultiQueries=true", "root", "1234");
Statement stmt = conn.createStatement();
String selectData = "SELECT id,name, author FROM t_books;"
+ "SELECT bookid, amount, saledate FROM t_booksale";
// 执行两条SELECT语句
if (stmt.execute(selectData))
{
ResultSet rs = null;
do
{
// 依次获得执行两条SELECT语句返回的ResultSet对象
rs = stmt.getResultSet();
// 输出当前记录集中的记录
while (rs.next())
{
System.out.print(rs.getString(1) + " ");
System.out.print(rs.getString(2) + " ");
System.out.println(rs.getString(3));
}
}
while (stmt.getMoreResults()); // 判断是否还有下一个记录集
}
}
}
3.程序总结
在使用execute方法执行多条SQL语句时应注意如下两点:
(1)由于MySQL JDBC驱动在默认时不支持多结果集,因此,要想使用execute方法执行多条查询SQL语句,必须在连接字符串中加上allowMultiQueries=true,如本例中的实现代码所示。
(2)当产生多个结果集时,execute方法只根据多条SQL语句中的第一条的类型来返回true或false。如果第一条SQL语句是查询语句,则getResultSet方法会返回一个ResultSet对象,execute方法返回true。而如果第一条SQL语句是不返回结果集的语句(如INSERT、UPDATE等),execute方法返回false。因此,如果在使用execute方法执行SQL语句前已经确定多条SQL语句都是查询语句时,可以不使用execute方法的返回值来判断SQL语句的类型,但如果是混合形式(就是SELECT和INSERT、UPDATE等语句混合成的SQL语句)的,就不能使用execute方法的返回值来判断是否会返回了结果集。在2.3.2节将介绍如何处理混合形式的SQL语句。