2010-03-15 41 views
2

我想創建一個擴展java.sql.ResultSet 並實現從SQL語句返回UTC日期的方法的myRecordSet對象。想從java.sql.ResultSet延伸

如何從java.sql.ResultSet延伸,我需要一個例子。

10X

+1

作業?我建議你閱讀如何擴展接口:http://java.sun.com/docs/books/tutorial/java/concepts/interface.html – mikek 2010-03-15 08:36:25

+2

@Mike:沒有幫助。 – Thilo 2010-03-15 08:41:52

回答

4

不要延長的ResultSet。創建你的實體類,比如說Person。並實施「獲取日期」方法。像這樣

class Person { 
    public Person(ResultSet resultSet) { 
     this.resultSet = resultSet; 
    } 

    ... 
    public Date getBirthday() { 
     resultSet.getDate("BIRTHDAY_COLUMN"); 
    } 
    ... 
} 

你應該知道,這Person類更像是包裝器,則純粹的實體。僅在已建立連接和有效的ResultSet對象的作用域中使用它纔是OK

while (resultSet.next()) { 
    Person person = new Person(resultSet); 

    someAction(person); 
    someMoreActions(person); 
} 

爲了使Person多個實體般的你可以考慮using JPA

+2

實體類應該更像是一個bean,儘管它的屬性從結果集中填充。特別是,它應該允許在創建實體後關閉ResultSet。如果ResultSet需要保持打開狀態(並指向正確的行)以使getter工作,您將遇到麻煩。 – Thilo 2010-03-15 08:44:16

+0

@Thilo:你是對的。我應該提到這一點。我只是展示瞭如何用自定義類替換ResultSet。當然,所有的結果集規則都適用於Person類。 – 2010-03-15 08:51:46

+1

我真的不會將幾個結果集與模型緊密結合。 – BalusC 2010-03-15 11:30:22

2

我想創建myRecordSet擴展java.sql.ResultSet中

很容易的 對象。一個體面的IDE將爲你做。

並實現從SQL語句返回 UTC日期的方法。

不可能的,因爲你不能讓你的數據庫創建你的類的實例,而不是它自己的。

所以你不想這樣做。你真正想要做的是爲ResultSet編寫一個包裝,它可以與你從數據庫中獲得的任何內容進行對話並添加你需要的任何功能。這被稱爲代表模式。

3

首先,你不延長接口,但你實現接口:)

這就是說,你很可能在尋找的解決方案錯誤的方向。忘記實施你的ResultSet,並創建一個DAO類,它可以完成所有的映射任務,並在那裏完成所需的日期轉換。該DAO方法可能看起來像

public Person find(Long id) throws SQLException { 
    Connection connection = null; 
    PreparedStatement preparedStatement = null; 
    ResultSet resultSet = null; 
    Person person = null; 

    try { 
     connection = database.getConnection(); 
     preparedStatement = connection.prepareStatement(SQL_FIND); 
     preparedStatement.setLong(1, id); 
     resultSet = preparedStatement.executeQuery(); 
     if (resultSet.next()) { 
      person = new Person(); 
      person.setId(resultSet.getLong("id")); 
      person.setName(resultSet.getString("name")); 
      person.setBirthDate(resultSet.getDate("birth_date")); 
      // ... 
     } 
    } finally { 
     close(connection, preparedStatement, resultSet); 
    } 

    return person; 
} 

你看,如果數據庫列類型是DATEDATETIMETIMESTAMP,那麼你可以只用ResultSet#getDate()獲得它作爲一個java.util.Date對象。要在表示層中以所需格式顯示日期,請使用因此提供的工具,如用於「普通Java」的SimpleDateFormat,用於JSP頁面的fmt:formatDate,用於JSF的f:convertDateTime等。

緊密耦合模型內部的ResultSet(實體,本例中的「Person」)是一個壞主意。該模型不需要知道它是如何創建的,並且它可能只會潛在地泄漏數據庫資源(因爲該方法可能需要始終打開ResultSet),並且可能會導致您的應用遲早會崩潰,因爲數據庫已經用完了資源。不要這樣做。

要獲得關於DAO的更多想法和見解,您可能會發現this article有用。

+0

+1。 「該模型不需要知道如何創建它」。這就是爲什麼我對像Hibernate這樣的系統有點小心謹慎,因爲它需要更緊密的整合來支持懶加載等事情。當它工作的時候都很棒,但是在引擎蓋下隱藏着太多的魔法(據說),但你仍然需要知道爲了正確使用所有東西。 – Thilo 2010-03-16 02:23:01