[英]Java JDBC storing ResultSet in ArrayList
我正在嘗試自己在Java中使用SQLite數據庫。
(我也在使用sqlite-jdbc-3.20.0庫 ,但我認為這個問題不受此影響。)
我創建了一些函數,以后將使用它們簡化我的工作流程。 為此,我創建了類DBInterface.java ,從它在Main.java類中創建了一個對象。
DBInterface.java的簡化內容:
/**
* Executes a sql String and returns it's results as ResultSet[].
*
* @param sql as String holidng the SQL statement to execute
* @return ResultSet[] containing the results of the query, or empty ResultSet[] if no results
*/
public ArrayList<ResultSet> excecute(String sql)
{
if(!isConnected()) return null;
try
{
return getResultSets(statement.execute(sql));
}
catch (SQLException e)
{
Main.log(tag, "An SQLException has occured for statement '"+sql+"':");
Main.log(tag, e);
}
return null;
}
/**
* Returns an array containing all resultSets of the last executed statement.
*
* @param isResultSet as boolean defining if the statement resulted in an result set
* @return
*/
private ArrayList<ResultSet> getResultSets(boolean isResultSet)
{
ArrayList<ResultSet> results = new ArrayList<>();
try
{
int count = 0;
while(true) {
if(isResultSet)
{
ResultSet set = statement.getResultSet();
results.add(set);
/*
while(set.next())
{
//Here the information can still be retrieved
Main.log(tag, ""+set.getString("name")+", row:"+set.getRow());
}
*/
}
else
{
if(statement.getUpdateCount() == -1)
{
break;
}
Main.log(tag, "Result '"+count+"' is just a count: '"+statement.getUpdateCount()+"'");
}
count ++;
isResultSet = statement.getMoreResults();
}
}
catch(SQLException e)
{
Main.log(tag, "An SQLException has occured while processing a request:");
Main.log(tag, e);
}
return results;
}
Main.java的簡化內容:
public static void main(String[] args)
{
[...]
dbInterface.excecute("DROP TABLE IF EXISTS Users");
dbInterface.excecute("CREATE TABLE IF NOT EXISTS Users (id INTEGER, name STRING(20));");
dbInterface.excecute("INSERT INTO Users (id, name) VALUES (1, \"Hans\");");
dbInterface.excecute("INSERT INTO Users (id, name) VALUES (2, \"Peter\");");
ArrayList<ResultSet> results = dbInterface.excecute("SELECT * FROM Users;");
log(tag, ""+results.size());
for(int i = 0; i < results.size(); i++)
{
ResultSet set = results.get(i);
try
{
///*
while(set.next())
{
//TODO Here the information can no longer be retrieved... :(
Main.log(tag, ""+set.getString("name")+", row:"+set.getRow());
}
//*/
}
catch (Exception e)
{
Main.log(tag, e);
}
}
}
根據我的理解,在某些情況下,SQL查詢可能會創建多個ResultSet,因此我只是將所有ResultSet對象簡單地添加到ArrayList中,這樣我就可以知道何時在其他地方處理結果了。 ResultSet存在。 不過,這毫無用處。 通過取消注釋DBInterface.java中getResultSets()中的塊,我可以確認結果集確實包含該信息。
但是,由於某些原因,我無法從ArrayList在Main.java中執行相同的操作。 我已經測試過更改功能,而是直接返回ResultSet對象,該方法確實起作用,但是它不能實現我的目標,因為我想返回所有可能的ResultSet objetcs,而不僅僅是一個。
您可以編寫一種將ResultSet轉換為列表,映射或類並將ResultSet的結果存儲在對象中的方法
像這樣
public List resultSetToArrayList(ResultSet rs) throws SQLException {
ResultSetMetaData md = rs.getMetaData();
int columns = md.getColumnCount();
List<Map<String, Object>> list = new ArrayList<>();
while (rs.next()) {
Map<String, Object> row = new HashMap<>(columns);
for (int i = 1; i <= columns; ++i) {
row.put(md.getColumnName(i), rs.getObject(i));
}
list.add(row);
}
return list;
}
切記在不使用時關閉ResultSet,Statement和Connection
關閉ResultSet顯式地使垃圾回收器有機會盡早重新收集內存,因為ResultSet對象可能會占用大量內存,具體取決於查詢。
當然,使用Spring會容易得多,但是最好知道如何使用普通的舊JDBC。
創建一個Java類來保存結果對象並返回列表中的對象,而不是返回List對象。
您可以使用專門用於返回這些對象的方法來執行此操作。
例如,如果創建了User類,則可以執行以下操作:
private static String SQL = "SELECT * FROM Users";
...
private List<User> getUsers()
{
List<User> results = new ArrayList<>();
try
{
PreparedStatement statement = connection.prepareStatement(SQL);
ResultSet rs = statement.executeQuery(SQL);
while(rs.next()) {
User aUser = new User();
aUser.setUserid(rs.getString("USER_ID"));
aUser.setUserName(rs.getString("USERNAME"));
...
results.add(aUser);
}
}
catch(SQLException e) {
// log any exceptions ...
}
finally() {
// always close your JDBC resources - google it
// example
try{
if (statement != null) {
statement.close();
statement=null;
}
}
catch(SQLException e) {
// couldn't close statement
}
...
}
return results;
}
如果您沒有使用JDBC DataSource ,那么您必須自己管理數據庫連接-這可能很繁瑣,並且是應用程序錯誤的常見來源。 幾乎所有現代Java應用程序都使用DataSource實現(並且池化DataSource非常普遍)而不是簡單的JDBC連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.