При использовании jdbctemplate с Spring должен ли я иметь базовый класс?

Весной я перехожу от спящего режима к jdbctemplate, и мне нужно некоторое руководство.

Я собираюсь создать UserDao, а затем UserDaoImpl.

В моем файле servlet.xml у меня создан bean-компонент источника данных.

Сейчас я читаю это: http://static.springsource.org/spring/docs/2.0.x/reference/jdbc.html

В нем говорится, что есть частный метод:

частный JdbcTemplate jdbcTemplate;

Итак, я могу создать свой UserDaoImpl следующим образом:

public class UserDaoImpl implements UserDao {
   private JdbcTemplate jdbcTemplate;

   public void setDataSource(DataSource dataSource) {
    this.jdbcTemplate = new JdbcTemplate(dataSource);
}

}
  1. Нужен ли мне установленный источник данных? Или я могу использовать какую-то аннотацию?
  2. Могу ли я переместить этот код в базовый класс, такой как GenericDao/GenericDaoImpl? (если да, то сохранить ли jdbcTempalte закрытым или защищенным?

С помощью спящего режима я смог добавить базовые запросы в свой базовый класс, используя дженерики, я предполагаю, что не могу сделать это с jdbc, поскольку ничего действительно не отображается в моих объектах, верно?

обновить

Итак, мой GenericDaoImpl выглядит так:

public class GenericDaoImpl<T> extends JdbcDaoSupport implements GenericDao<T> {

    private JdbcTemplate jdbcTemplate;

 }

Тогда мой UserDaoImpl выглядит так:

@Repository
public class UserDaoImpl extends GenericDaoImpl<User> implements UserDao {

}
  1. Теперь я не могу использовать this.jdbcTemplate в своих методах? Что я делаю?
  2. В моем GenericDaoImpl у меня может быть setDataSource, так как JdbcDaoSupport помечает его как final.
    Как мне теперь автоматически связать источник данных?

person Blankman    schedule 26.11.2011    source источник
comment
Источник данных можно переместить в базовый класс и установить с помощью аннотации или конфигурации XML. Вы действительно используете Spring 2.0?   -  person Dave Newton    schedule 26.11.2011
comment
Нет, я использую Spring 3.0.6, почему?   -  person Blankman    schedule 26.11.2011
comment
Поскольку вы ссылались на документы версии 2.0.   -  person Dave Newton    schedule 26.11.2011
comment
ваше право, спасибо за это, теперь я вижу аннотации, которые могу использовать (репозиторий и автосвязь).   -  person Blankman    schedule 26.11.2011
comment
Что это означает: если вы используете класс Spring JdbcDaoSupport, и ваши различные классы DAO, поддерживаемые JDBC, расширяются от него, то ваш подкласс наследует метод setDataSource(..) от класса JdbcDaoSupport. Вы можете выбрать, наследоваться ли от этого класса. Класс JdbcDaoSupport предоставляется только для удобства.   -  person Blankman    schedule 26.11.2011
comment
@Dave, пожалуйста, смотрите мои обновления выше.   -  person Blankman    schedule 26.11.2011


Ответы (1)


Предполагая, что вы используете Spring 3, источник данных можно внедрить в родительский класс DAO с помощью конфигурации XML или аннотаций. В XML "дочерние" компоненты могут использовать ключевое слово extends для использования dataSource суперкласса.

Класс JdbcDaoSupport — это небольшой служебный класс, который объединяет некоторые общие функции, такие как свойства dataSource и jdbcTemplate (и некоторые другие вещи). Это всего лишь один из тех маленьких удобных классов, которые люди в любом случае создают для себя, поэтому вместо этого он предоставляется.

Используйте getDataSource() для получения источника данных. Вам не нужен setDataSource(), он уже есть в JdbcDaoSupport; что бы вы сделали по-другому? Если он вам действительно нужен, скорее всего, вы не захотите использовать JdbcDaoSupport. Относительно необычно нужно что-то кроме простого геттера/сеттера.

person Dave Newton    schedule 26.11.2011
comment
но как мне автоматически подключить источник данных в моем GenericDaoImpl? Я получаю сообщение об ошибке: Не удалось автоматически связать поле: javax.sql.DataSource com.abc.dao.GenericDaoImpl.dataSource; - person Blankman; 26.11.2011
comment
@Blankman Почему у вашего JdbcDaoSupport есть собственный элемент dataSource? - person Dave Newton; 26.11.2011
comment
@Dave Дэйв, я думал, что должен определить это, чтобы добавить аннотацию для автоматического подключения. - person Blankman; 26.11.2011
comment
удаляя его, я получаю: Не удалось вызвать метод инициализации; вложенным исключением является java.lang.IllegalArgumentException: 'dataSource' или 'jdbcTemplate' требуется org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1420) для файла UserDaoImpl. - person Blankman; 26.11.2011
comment
О, с аннотациями. IIRC об этом было подано в JIRA миллион лет назад (или 3.5), по-видимому, из этого ничего не вышло (относительно части final). Я думаю, вам, вероятно, не повезло, если вы не создадите свой собственный абстрактный подкласс или просто пропустите его. Какая-то боль. Или, возможно, вы могли бы сделать эту часть в XML; Точно сказать не могу. - person Dave Newton; 26.11.2011
comment
хорошо, поэтому я удалил @Repository и вручную добавил bean-компонент в свой xml, и это сработало, спасибо! - person Blankman; 26.11.2011
comment
@Blankman А, круто. Да, я подозреваю, что некоторые из этих служебных классов на самом деле не были обновлены для нового мира аннотаций (очевидно :( Я не замечаю этого, потому что я все еще выполняю значительную часть этой инфраструктурной работы в XML. - person Dave Newton; 26.11.2011