給定 java.sql.PreparedStatement 的實體 stmt stmt.executeQuery(),如果我的 SQL 陳述句是 SELECT,則我可以執行回傳結果的操作,或者我可以執行stmt.executeUpdate()INSERT 或 UPDATE。
現在,建議案例,我不知道,正在執行什么樣的SQL陳述句?我希望有一些方便的東西,比如stmt.hasResultSet(),但那并不存在。決議 SQL 陳述句似乎不是一個好的選擇。
uj5u.com熱心網友回復:
JDBC API正是為此目的提供了PreparedStatement.execute()方法(和Statement.execute(String)):
執行此
PreparedStatement物件中的 SQL 陳述句,可以是任何型別的 SQL 陳述句。一些準備好的陳述句回傳多個結果;該execute方法處理這些復雜的陳述句以及由方法executeQuery和處理的更簡單形式的陳述句executeUpdate。該
execute方法回傳 aboolean以指示第一個結果的形式。您必須呼叫方法getResultSet或getUpdateCount檢索結果;您必須呼叫getMoreResults以移動到任何后續結果。回傳:
true如果第一個結果是一個ResultSet物件;false如果第一個結果是更新計數或沒有結果
因此,要執行未知陳述句,您需要執行以下操作:
try (PreparedStatement pstmt = connection.prepareStatement(unknownStatement)) {
// set variables ...
boolean currentResult = pstmt.execute();
while (true) {
if (currentResult) {
try (ResultSet rs = pstmt.getResultSet()) {
// process result set
}
} else {
int updateCount = pstmt.getUpdateCount();
if (updateCount == -1) {
// no more results
break;
}
// do something with update count
}
currentResult = pstmt.getMoreResults();
}
}
存在回圈是因為某些資料庫系統(例如 SQL Server)可以產生多個結果集和多個更新計數,而這將處理所有這些。
uj5u.com熱心網友回復:
既然你是說……我想準備一些東西。可以選擇或插入某些內容,但我不知道是哪個。
只有幾個選項:(1)如果你想在prepare/exec之前知道,parse-the-sql,(2)對于after-exec,創建你自己的hasResultset(),它根據execute()的回傳值回傳true/false .
uj5u.com熱心網友回復:
您可以始終執行executeQuery()但傳遞給結果集,例如:
ResultSet rs = ps.executeQuery();
獲得 ResultSet 后,您可以獲取其元資料:
ResultSetMetaData rsmd = rs.getMetaData();
在此元資料中,您可以檢查 getColumnCount() 是否為零或更多,這樣您甚至可以獲得回傳的精確列數以使用回圈執行通用決議:
final ResultSetMetaData rsmd = rs.getMetaData();
final int columnCount = rsmd.getColumnCount();
if (columnCount > 0) {
while (rs.next()) {
final StringBuilder sb = new StringBuilder();
for (int i = 1 ; i <= columnCount ; i ) {
sb.append(rs.getString(i));
if (i < columnCount) {
sb.append(", ");
}
}
temp.add(sb.toString());
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/360115.html
上一篇:按貓鼬中的孫子財產過濾
