2009-11-15 30 views
1

我只是想知道是否有辦法讓Java方法返回多個值。如何讓Java方法返回多個值?

我正在創建一個使用jdbc庫來處理數據庫的應用程序。我可以成功地將值輸入數據庫,但我需要一種方法來返回它們,這就是我有點卡住的地方。我創建了一個表單,用戶輸入一個特定的值(一個ID號),然後由數據庫類傳遞給我,這個數據庫類執行我的數據庫工作。

Database newQuery = new Database();  
newQuery.getCust(c_ID);   //uses the GetCust method in my class, 
           //passing it the ID of the customer. 

在我的數據庫類getCust()方法創建以下查詢:

ResultSet Customer = stat.executeQuery("SELECT * FROM Persons WHERE Cust_ID=C_ID"); 

我需要一種方法來恢復存儲在客戶回結果。有任何想法嗎?

+0

可能重複的[如何從Java方法返回多個對象?](http://stackoverflow.com/questions/457629/how-to-return-multiple-objects-from-a-java-method) – ripper234 2012-01-04 11:26:00

回答

7

爲什麼不直接返回Customer,或者創建一個包含您想返回的所有值的小類並返回該類?

+3

因爲語言不需要妨礙你的代碼,尤其是「更高級別」的語言。 – Mikle 2011-06-02 22:25:54

7

不能準確地從Java中的某個方法返回多個值,但始終可以返回一個容納多個值的容器對象。在你的情況下,最簡單的事情就是返回ResultSet,Customer。

如果您擔心將數據層暴露給用戶界面,可以將數據從ResultSet複製到一個不太特定於數據庫的結構中,可以是地圖列表,也可以是客戶對象列表,其中Custom是代表您業務實體的新類。

+1

返回ResultSet似乎是一個簡單的解決方案,但它有點問題。因爲ResultSet應該(即必須)在使用後關閉,但是誰負責?調用函數?當PreparedStatement發揮作用時它變得更糟,因爲那個應該被關閉,但是這樣做也會關閉ResultSet ... – 2009-11-15 12:49:26

0

每位客戶都可能會附帶一個介紹一種採用多個參數的方法的小界面。然後傳遞實現此接口的對象以將結果傳遞給它。

實現它的對象當然可以與調用getCustomer所屬的方法相同,所以它只是傳遞對'this'的引用並將參數分配給字段,您可以期望在所有字段中設置它們回報。

0

考慮使用對象/關係映射庫。它將處理將您需要從JDBC ResultSet返回到單個Java bean對象中的多個數據值打包的細節。

選擇哪一個是另一個討論。很多聰明人使用Hibernate。 Java平臺包括JPA。使用現成的產品可以幫助您避免發明自己的產品,這就是設計自己的對象和產品組合的最終目的。

3

所以你的實際問題是,你不知道如何設置SQL查詢中的值/參數?唯一正確的方法是使用PreparedStatement

String sql = "select * from Customers where Cust_ID = ?"; 
preparedStatement = connection.prepareStatement(sql); 
preparedStatement.setLong(custId); 
resultSet = preparedStatement.executeQuery(); 

它不僅簡化了設置在一個SQL查詢Java對象(StringLongIntegerDateInputStream等),但大多數importantingly它可以使你免於SQL Injectionrisks。此外,它也比預編譯的Statement快。

至於您的代碼邏輯,您應該始終在finally區塊中按相反順序關閉DB資源,以避免發生異常時的資源泄漏。這裏有一個基本的例子,如何獲得Customer正確的JDBC方式:

public Customer find(Long customerId) throws SQLException { 
    String sql = "SELECT id, name, age FROM customer WHERE id = ?"; 
    Connection connection = null; 
    PreparedStatement preparedStatement = null; 
    ResultSet resultSet = null; 
    Customer customer = null; 

    try { 
     connection = getConnectionSomehow(); 
     preparedStatement = connection.prepareStatement(sql); 
     preparedStatement.setLong(custId); 
     resultSet = preparedStatement.executeQuery(); 
     if (resultSet.next()) { 
      customer = new Customer(); 
      customer.setId(resultSet.getLong("id")); 
      customer.setName(resultSet.getString("name")); 
      customer.setAge(resultSet.getInteger("age")); 
     } 
    } finally { 
     if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {} 
     if (preparedStatement != null) try { preparedStatement.close(); } catch (SQLException ignore) {} 
     if (connection != null) try { connection.close(); } catch (SQLException ignore) {} 
    } 

    return customer; 
} 

您可能會發現this tutorial有用的,以獲得更多的見解和實例。

0

除了使用Hibernate - 看看Spring。它支持連接池等,並允許您完全從代碼中提取JDBC。

它會返回給您一個地圖列表或您自定義類型的列表(取決於您如何調用它)。