2.3.1 用execute方法执行混合形式的SQL语句
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所示的运行结果。
图2.1 DBConsole运行界面
4.程序总结
在使用execute方法执行多条SQL语句时,由于这些SQL语句可能是SELECT语句,也可能是UPDATE、INSERT等不返回结果集的SQL语句,因此,要想处理所有SQL语句执行的结果(处理SELECT语句返回的结果集,获得不返回结果集的SQL语句的更新记录数),必须要同时满足以下两个条件,才表示所有的执行结果都处理完毕了:
stmt.getMoreResults() == false
stmt.getUpdateCount() == -1