2.3.1 用execute方法执行混合形式的SQL语句

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

execute方法不仅能执行查询语句,还可以执行不返回结果集的SQL语句,甚至可以同时执行这些SQL语句的混合形式,如下面的代码所示:

String insertData = "INSERT INTO jdbcdemo.t_books(name,isbn,author,price) values("+ " '人月神话',  '6787102165345',  '布鲁克斯',  52)";
selectData = "SELECT * FROM jdbcdemo.t_books";
stmt.execute(insertData + ";" + insertData + ";" + selectData);

如果用execute方法执行上面代码所示的混合形式的SQL语句,就不能简单地使用execute方法的返回值或getMoreResults()方法来处理每条SQL语句的执行结果,而是要使用一个getUpdateCount()方法。如果当前执行的语句是返回结果集的SQL语句,getUpdateCount()方法返回-1,否则,返回实际的更新记录数。只有当getMoreResults()方法返回false,并且getUpdateCount()返回-1时,才表明所有的结果都被处理到了,如下面代码所示:

do

{

// 响应的处理代码

}

while (!(stmt.getMoreResults() == false && stmt.getUpdateCount() == -1));

下面给出一个实例来演示如何使用execute方法执行混合SQL语句(包括SELECT、INSERT、UPDATE、DELETE等SQL语句)。

例子 用execute方法执行混合SQL语句

1.程序分析说明

用户可以通过本程序输入一个或多个SQL语句,如果输入多个SQL语句,中间用分号(;)分隔。在输入完SQL语句后,按回车后,系统将执行这些SQL语句,并输出执行的结果。如果执行的是SELECT语句,就会输出查询结果,否则,会输出记录的更新数。

2.代码编写

本系统是一个控制台程序,用户可以通过控制台输入SQL语句。当输入q时,系统退出。例子的实现代码如下:

public class DBConsole

{

    // 为字符串补齐空格

    private static String fillSpace(String s, int length)

    {

        int spaceCount = length - s.getBytes().length;

        for (int i = 0; i < spaceCount; i++)

            s += " ";

        return s;

    }

    // 处理用户输入的SQL语句或命令

    private static boolean processCommand(String cmd, Statement stmt)

            throws Exception

    {

        // 输入q,退出程序

        if (cmd.equals("q")) 

        {           

              stmt.close();

            return false;

        }

        stmt.execute(cmd);// 执行sql语句(可能是多条)

        do

        {

            ResultSet rs = null;

            rs = stmt.getResultSet();//  获得执行的第一条SQL语句的ResultSet对象

            //  如果返回的不是空,则说明执行的第一条SQL语句是SELECT语句

            if (rs != null)

            {

                //  得到当前记录集的列数

                int columnCount = rs.getMetaData().getColumnCount();

                //  输出列名,每列宽度是20个字符

                for (int i = 1; i <= columnCount; i++) 

                    System.out.print(fillSpace(rs.getMetaData()

                            .getColumnName(i), 20));

                System.out.println();

                //  输出记录集中的记录

                while (rs.next())

                {

                    for (int i = 1; i <= columnCount; i++)

                    {

                        System.out.print(fillSpace(rs.getString(i), 20));

                    }

                    System.out.println();

                }

            }

            //  如返回的ResultSet对象是null,说明执行的第一条SQL语句是非SELECT语句

            else

                System.out.println("更新记录数:" + stmt.getUpdateCount());

        }

        //  判断是否处理完了所有的执行结果

        while (!(stmt.getMoreResults() == false && stmt.getUpdateCount() == -1));

        return true;

    }

 

    public static void main(String[] args) throws Exception

    {

        String serverName, dbName, userName, password;

        //  定义服务器名、数据库名、用户名和密码

        serverName = "localhost";

        dbName = "mydb";

        userName = "root";

        password = "1234";

        //  定义连接字符串

        String url = "jdbc:mysql://" + serverName + "/" + dbName

                + "?characterEncoding=UTF8&allowMultiQueries=true";

        //  装载mysql驱动

        Class.forName("com.mysql.jdbc.Driver");

        //  获得Connection对象

        Connection conn = DriverManager.getConnection(url, userName, password);

        Statement stmt = conn.createStatement();

        String cmd = "";

        do

        {

            java.io.InputStreamReader isr = new java.io.InputStreamReader(

                    System.in);

            java.io.BufferedReader br = new java.io.BufferedReader(isr);

            System.out.print("sql>");

            cmd = br.readLine();  // 从控制台读入用户输入的命令

            if(cmd.equals("")) continue;//  如果输入空串,重新循环

            try

            {

                //  开始处理输入的SQL语句,如果输入的是q,则返回false,并退出系统

                if (!processCommand(cmd, stmt))           

                    break;

 

            }

            catch (Exception e)

            {

                System.out.println(e.getMessage());

            }

        }

        while (true);

        conn.close();

    }

}

3.程序测试

使用如下的命令运行DBConsole:

java chapter2.DBConsole

在控制台中输入如下的SQL语句:

select name, author, price from t_books;delete from t_books where price=52

在输入上面的SQL语句后,按回车键,在控制台中将输出如图2.1所示的运行结果。

01

图2.1 DBConsole运行界面

4.程序总结

在使用execute方法执行多条SQL语句时,由于这些SQL语句可能是SELECT语句,也可能是UPDATE、INSERT等不返回结果集的SQL语句,因此,要想处理所有SQL语句执行的结果(处理SELECT语句返回的结果集,获得不返回结果集的SQL语句的更新记录数),必须要同时满足以下两个条件,才表示所有的执行结果都处理完毕了:

stmt.getMoreResults() == false

stmt.getUpdateCount() == -1