繁体   English   中英

想要从java.sql.ResultSet扩展

[英]Want to extend from java.sql.ResultSet

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

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

10X

不要扩展ResultSet。 创建你的实体类,比如说Person 并实施'获取日期'方法。 像这样

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

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

你应该知道这个Person类更像是包装器而不是纯实体。 而且使用它是OK只有在你已经建立的连接和有效的ResultSet对象范围。

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

    someAction(person);
    someMoreActions(person);
}

为了使Person更像实体,你可以考虑使用JPA

首先,你不扩展接口,但你实现了接口:)

也就是说,您可能正在寻找解决方案的错误方向。 忘记实现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,等等。

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

要获得有关DAO的更多想法和见解,您可能会发现本文很有用。

我想创建扩展java.sql.ResultSet的myRecordSet对象

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM