2010-03-15 81 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