Хотите расширить с java.sql.ResultSet - PullRequest
2 голосов
/ 15 марта 2010

Я хотел бы создать объект myRecordSet, который расширяет java.sql.ResultSet и реализовать метод, который возвращает дату UTC из оператора SQL.

Как мне перейти от java.sql.ResultSet, мне нужен пример.

10X

Ответы [ 3 ]

4 голосов
/ 15 марта 2010

Не расширяйте 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

3 голосов
/ 15 марта 2010

Во-первых, вы не расширяете интерфейсы, но вы реализуете интерфейсы:)

Тем не менее, вы, вероятно, ищете неправильное направление для решения. Забудьте о реализации вашего 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 и т. Д.

Тесное связывание ResultSet внутри модели (сущность, «Человек» в этом примере) - плохая идея. Модель не должна ничего знать о том, как она была создана, и что это может привести только к утечке ресурсов БД (поскольку при таком подходе может потребоваться постоянное открытие ResultSet), что может привести к сбою вашего приложения раньше или позже, потому что в БД закончились ресурсы. Не делай этого.

Чтобы получить больше идей и идей о DAO, вы можете найти эту статью полезной.

2 голосов
/ 15 марта 2010

Я хотел бы создать myRecordSet объект, который расширяет java.sql.ResultSet

Достаточно просто. Достойная IDE сделает это за вас.

и реализовать метод, который возвращает Дата UTC из оператора SQL.

Невозможно, потому что вы не можете заставить вашу базу данных создать экземпляр вашего класса вместо его собственного.

Так что вы не хотите этого делать. Что вы действительно хотите сделать, так это написать оболочку для ResultSet, которая обращается к тому, что вы получаете из базы данных, и добавляет любую необходимую вам функциональность. Это называется шаблоном делегата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...