1、 SQL queries 返回 result sets; SQL updates 返回被更新的数据数目. 有时候我们可能不知道执行的SQL将使查询还是更新或者混合两种混合类型!这时候excute出场了。
Statement提供了下面的方法用来处理返回类型的多样化问题。
boolean execute(String sql); ResultSet getResultSet(); int getUpdateCount(); boolean getMoreResults(); boolean getMoreResults(int current);
2、Excute()方法可以返回的是多个result组成的results集合,result可以是ResultSet ,整数或者两者混合(result相当于一个数组里面存有ResultSet 和整数)。注意到excute()方法的返回式布尔型,如果执行成功返回的是True,如果是失败是False。
第二个方法getResultSet();测试当前的result,如果是集合,那么返回一个ResultSet,如果是Null那么说明当前的结果集是一个整数 ,可以使用第三个方法getUpdateCount();获得更新的数目。
第三和第四个方法用来移动到下一个result.如果下一个result是ResultSet那么返回true,如果null或者证书那么返回的是false.
第四个方法有三个参数,分别意义如下:
CLOSE_CURRENT_RESULT: 只要返回下一个result,那么关闭当前的result
KEEP_CURRENT_RESULT: 当取下一个result时不关闭当前的result
CLOSE_ALL_RESULTS: 关闭前面所有的result当开始下一个时.当(!getMoreResults() && (getUpdateCount() == -1))时已经移动到了集合的最后一个.
...
Connection myConnection = DriverManager.getConnection(url,
"javauser", "hotjava");
Statement myStatement = myConnection.createStatement();
ResultSet rs;
if (myStatement.execute(sqlStatement))
{
// we have a ResultSet
rs = myStatement.getResultSet();
while (rs.next())
{
// process the rows
}
}
else
{
// we have an update count
System.out.println(myStatement.getUpdateCount());
}
myStatement.close();
myConnection.close();
...
...
处理多种返回类型
...
...
Connection myConnection = DriverManager.getConnection(url,
"javauser", "hotjava");
Statement myStatement = myConnection.createStatement();
boolean resultSetIsAvailable;
boolean moreResultsAvailable;
int i = 0;
int res=0;
resultSetIsAvailable = myStatement.execute(sqlText);
ResultSet rs = null;
for (moreResultsAvailable = true; moreResultsAvailable; )
{
if (resultSetIsAvailable)
{
if ((rs = myStatement.getResultSet()) != null) {
// we have a resultset
ResultSetMetaData rsmd = rs.getMetaData();
int numCols = rsmd.getColumnCount();
// display column headers
for (i = 1; i <= numCols; i++)
{
if (i > 1) System.out.print(", ");
System.out.print(
rsmd.getColumnLabel(i));
}
System.out.println("");
// step through the rows
while (rs.next())
{
// process the columns
for (i = 1; i <= numCols; i++)
{
if (i > 1)
System.out.print(", ");
System.out.print(rs.getString(i));
}
System.out.println("");
}
}
}
else
{
if ((res = curStmt.getUpdateCount()) != -1)
{
// we have an updatecount
System.out.println(res + " row(s) affected.");
}
// else no more results
else
{
moreResultsAvailable = false;
}
}
if (moreResultsAvailable)
{
resultSetIsAvailable =
myStatement.getMoreResults(Statement.CLOSE_ALL_RESULTS);
}
}
if (rs != null) rs.close();
myStatement.close();
...
...
3、另外两个常用的方法:
Statement的Cancel 方法:
void cancel();
...
java.sql.Statement myStatement =
myConnection.createStatement();
ResultSet rs = myStatement.executeQuery("SELECT name, title, salary FROM
employees");
int i = 0;
while (rs.next()) {
// increment the counter
i++;
// print the columns of the row that was retrieved
String empName = rs.getString("name");
String empTitle = rs.getString("title");
long empSalary = rs.getLong("salary");
System.out.println("Employee " + empName + " is " + empTitle + "
and earns $" + empSalary);
// cancel all results if 100 rows of data were already
// retrieved
if (i >= 100) myStatement.cancel();
}
...
...
ResultSet的Close 方法:ResultSet不需要使用了
void close();