想要从java.sql.ResultSet扩展

时间:2010-03-15 08:29:34

标签: java jdbc

我想创建扩展java.sql.ResultSet的myRecordSet对象 并实现一个从SQL语句返回UTC日期的方法。

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

10X

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

首先,您没有扩展接口,但您实施接口:)

那就是说,你可能正在寻找解决方案的错误方向。忘记实现ResultSet并创建一个DAO类,它可以完成所有ResultSet< - > Entity映射任务并在那里进行所需的日期转换。 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获取宾语。要在表示层中以所需格式显示日期,请使用提供的工具,如SimpleDateFormat表示“普通Java”,fmt:formatDate表示JSP页面,f:convertDateTime表示JSF,等等。 / p>

紧密耦合模型中的ResultSet(实例,本例中的“Person”)是一个坏主意。该模型不需要知道如何创建它并且这样做可能只会泄漏数据库资源(因为该方法可能需要ResultSet一直打开)并且可能导致您的应用程序崩溃迟早因为数据库耗尽了资源。不要那样做。

要获得有关DAO的更多想法和见解,您可能会发现this article非常有用。

答案 2 :(得分:2)

  

我想创建myRecordSet   扩展java.sql.ResultSet

的对象

够容易。一个体面的IDE会为你做。

  

并实现一个返回的方法   来自SQL语句的UTC日期。

不可能,因为您无法让数据库创建您的类的实例而不是它自己的实例。

所以你不想这样做。你真正想做的是为ResultSet编写一个包装器,它与你从数据库中获得的内容进行对话,并添加你需要的任何功能。这称为委托模式。