13.4.2 使用execute方法执行SQL语句

13.4.2 使用execute方法执行SQL语句

Statementexecute()方法几乎可以执行任何SQL语句,但它执行SQL语句时比较麻烦,通常没有必要使用execute()方法来执行SQL语句,使用executeQuery()executeUpdate()方法更简单。但如果不清楚SQL语句的类型,则只能使用execute方法来执行该SQL语句了。
使用execute()方法执行SQL语句的返回值是boolean值,它表明执行该SQL语句是否返回了ResultSet对象。那么如何来获取执行SQL语句后得到的ResultSet对象呢? Statement提供了如下两个方法来获取执行结果。

方法 描述
getResultSet() 获取该Statement执行查询语句所返回的ResultSet对象。
getUpdateCount() 获取该Statement执行DML语句所影响的记录行数

下面程序示范了使用Statementexecute()方法来执行任意的SQL语句,执行不同的SQL语句时产生不同的输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import java.util.*;
import java.io.*;
import java.sql.*;

public class ExecuteSQL
{
private String driver;
private String url;
private String user;
private String pass;
public void initParam(String paramFile) throws Exception
{
// 使用Properties类来加载属性文件
Properties props = new Properties();
props.load(new FileInputStream(paramFile));
driver = props.getProperty("driver");
url = props.getProperty("url");
user = props.getProperty("user");
pass = props.getProperty("pass");
}
public void executeSql(String sql) throws Exception
{
// 1.加载驱动
Class.forName(driver);
try (
// 2.获取数据库连接
Connection conn = DriverManager.getConnection(url, user, pass);
// 3.使用Connection来创建一个Statement对象
Statement stmt = conn.createStatement())
{
// 4.执行SQL,返回boolean值表示是否包含ResultSet
boolean hasResultSet = stmt.execute(sql);
// 5.如果执行后有ResultSet结果集
if (hasResultSet)
{
try (
// 获取结果集
ResultSet rs = stmt.getResultSet())
{
// ResultSetMetaData是用于分析结果集的元数据接口
ResultSetMetaData rsmd = rs.getMetaData();
// 获取列数
int columnCount = rsmd.getColumnCount();
// 迭代输出ResultSet对象
while (rs.next())
{
// 依次输出每列的值
for (int i = 0; i < columnCount; i++)
{
System.out.print(rs.getString(i + 1) + "\t");
}
System.out.print("\n");
}
}
} else
{
System.out
.println("该SQL语句影响的记录有" + stmt.getUpdateCount() + "条");
}
}
}
public static void main(String[] args) throws Exception
{
ExecuteSQL es = new ExecuteSQL();
es.initParam("mysql.ini");
System.out.println("------执行删除表的DDL语句-----");
es.executeSql("drop table if exists my_test");
System.out.println("------执行建表的DDL语句-----");
es.executeSql("create table my_test"
+ "(test_id int auto_increment primary key, "
+ "test_name varchar(255))");
System.out.println("------执行插入数据的DML语句-----");
es.executeSql("insert into my_test(test_name) "
+ "select student_name from student_table");
System.out.println("------执行查询数据的查询语句-----");
es.executeSql("select * from my_test");
}
}

运行上面程序,会看到使用Statement的不同方法执行不同SQL语句的效果。执行DDL语句显示受影响的记录条数为0;执行DML语句显示插入、修改或删除的记录条数;执行查询语句则可以输出查询结果。
提示
上面程序获得SQL执行结果时没有根据各列的数据类型调用相应的getXxx()方法而是直接使用getString()方法来取得值,这是可以的。 ResultSetgetString()方法几乎可以获取除Blob之外的任意类型列的值,因为所有的数据类型都可以自动转换成字符串类型。