使用Statement对象执行SQL语句¶
Statement接口提供了三种执行SQL语句的方法:executeQuery、executeUpdate和execute。使用哪一个方法由SQL语句执行后产生的结果而决定。
方法executeQuery用于产生单个结果集的语句,例如SELECT语句,执行executeQuery方法将返回一个结果集对象。方法executeUpdate用于执行INSERT、UPDATE或DELETE语句以及SQL DDL(数据定义语言)语句,例如CREATE TABLE和DROP TABLE。由于INSERT、UPDATE或DELETE语句的效果是修改表中若干行中的一列或多列,所以executeUpdate的返回值是一个整数,指示受影响的行数(即更新记录数);对于CREATE TABLE或DROP TABLE等不操作行的语句,executeUpdate的返回值总是为零(我们把这个零返回值也视为更新记录数,即没有记录受到影响)。当被执行的SQL语句返回一个更新记录数、一个结果集、多结果集或者SQL语句的类型未知,则使用execute方法。下面的例子演示了以上方法的使用。
使用executeQuery方法处理SQL数据查询语句:
ResultSet rs;
try {
Statement stmt = con.createStatement();
String sql = "SELECT * FROM TEST";
rs = stmt.executeQuery(sql);
while (rs.next()) {
// 处理获得的数据记录
}
stmt.close();
rs.close();
} catch (SQLException e) {
fail(e.getMessage());
}
使用executeUpdate方法处理SQL数据操纵语句:
Statement stmt=con.createStatement();
try {
String sql = "INSERT INTO TEST VALUES(1,'shentong')";
int rows = stmt.executeUpdate(sql);
assertNotEquals(-1, rows);
stmt.close();
} catch (SQLException e) {
fail(e.getMessage());
}
使用executeUpdate方法处理SQL数据定义语句:
Statement stmt = con.createStatement();
String sql = "CREATE TABLE TEST(ID INT, VALUE VARCHAR(100))";
int updcount = stmt.executeUpdate(sql);
使用execute方法处理SQL语句:
Statement stmt;
boolean retVal;
try {
String sql = "SELECT ID FROM TEST WHERE ID > 0;"
+ "INSERT INTO TEST VALUES(20,'VALUE20');"
+ "SELECT VALUE FROM TEST WHERE ID > 10";
stmt = con.createStatement();
retVal = stmt.execute(sql);
ResultSet rs;
int count;
do {
if (retVal == false) {
// 如果没有结果集
count = stmt.getUpdateCount();
if (count == -1) {
// 说明既没有结果集,也没有更新的记录数,即下面再也没有
// results了,跳出循环
break;
} else {
// 如果有记录被更新
// <some code>
}
} else { // 有结果集返回
rs = stmt.getResultSet();
// 处理ResultSet
}
// 获得下一个结果集或更新的记录数
retVal = stmt.getMoreResults();
} while (true);
} catch (SQLException e) {
fail(e.getMessage());
}
需要说明的是,执行上面提及的任一种方法都将关闭所调用的Statement对象的当前打开结果集(如果存在)。这意味着在重新执行Statement对象之前,需要完成对当前ResultSet对象的处理。