2.2.3 处理多个结果集

优质
小牛编辑
135浏览
2023-12-01

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语句。