我想创建扩展java.sql.ResultSet
的myRecordSet对象
并实现一个从SQL语句返回UTC日期的方法。
如何从java.sql.ResultSet
延伸,我需要一个例子。
10X
答案 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;
}
您会看到,如果数据库列类型为DATE
,DATETIME
或TIMESTAMP
,那么您只需使用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编写一个包装器,它与你从数据库中获得的内容进行对话,并添加你需要的任何功能。这称为委托模式。