1 回答

TA貢獻1840條經(jīng)驗 獲得超5個贊
你基本上有3個選擇:
不要關(guān)閉方法中的
ResultSet
,Statement
和Connection
,將執(zhí)行此操作的責任移交給調(diào)用者。不推薦,因為它容易出錯,并且會破壞格式良好的代碼結(jié)構(gòu)范例。
按照Jacob G.的建議,傳入具有處理數(shù)據(jù)所需邏輯的對象。
例如使用 Java 8+
Consumer
:
public static void queryDB(String query, Consumer<ResultSet> processor) {
try (
Connection connection = DriverManager.getConnection("jdbc:sqlite:" + Settings.SQLITE_DB_PATH);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(query);
) {
processor.accept(resultSet);
} catch (SQLException ex) {
Logger.getLogger(SQLInterp.class.getName()).log(Level.SEVERE, null, ex);
}
}
然后像這樣調(diào)用它:
SQLInterp.queryDB("SELECT * FROM foo", rs -> {
while (rs.next()) {
// process data here
}
});
以通用數(shù)據(jù)結(jié)構(gòu)將所有數(shù)據(jù)讀入內(nèi)存,例如List<Map<String, Object>>:
這當然假設查詢對每一列都有很好的唯一名稱。
public static List<Map<String, Object>> queryDB2(String query) {
try (
Connection connection = DriverManager.getConnection("jdbc:sqlite:" + Settings.SQLITE_DB_PATH);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(query);
) {
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
String[] name = new String[columnCount];
for (int i = 0; i < columnCount; i++)
name[i] = metaData.getColumnLabel(i + 1);
List<Map<String, Object>> rows = new ArrayList<>();
while (resultSet.next()) {
Map<String, Object> row = new LinkedHashMap<>();
for (int i = 0; i < columnCount; i++)
row.put(name[i], resultSet.getObject(i + 1));
rows.add(row);
}
return rows;
} catch (SQLException ex) {
Logger.getLogger(SQLInterp.class.getName()).log(Level.SEVERE, null, ex);
}
}
添加回答
舉報