Вот введение в каждую упомянутую технологию.
Spring-DAO
Spring-DAO - это не модуль Spring в строгом смысле слова, а скорее соглашения, которые должны побуждать вас писать DAO и писать их хорошо. Таким образом, он не предоставляет ни интерфейсов, ни реализаций, ни шаблонов для доступа к вашим данным. При написании DAO вы должны аннотировать их, @Repository
чтобы исключения, связанные с базовой технологией (JDBC, Hibernate, JPA и т. Д.), Последовательно транслировались в соответствующий DataAccessException
подкласс.
В качестве примера предположим, что теперь вы используете Hibernate, и ваш уровень сервиса «улавливает», HibernateException
чтобы на него реагировать. Если вы перейдете на JPA, ваши интерфейсы DAO не должны измениться, и уровень обслуживания будет по-прежнему компилироваться с блоками, которые улавливаются HibernateException
, но вы никогда не войдете в эти блоки, поскольку ваши DAO теперь выбрасывают JPA PersistenceException
. При использовании @Repository
в вашем DAO исключения, связанные с базовой технологией, переводятся в Spring DataAccessException
; ваш уровень обслуживания улавливает эти исключения, и если вы решите изменить технологию сохранения, DataAccessExceptions
все равно будет выброшен тот же Spring, так как Spring преобразовал собственные исключения.
Обратите внимание, однако, что это имеет ограниченное использование по следующим причинам:
- Обычно вам не следует перехватывать исключения персистентности, так как поставщик мог откатить транзакцию (в зависимости от точного подтипа исключения), и поэтому вам не следует продолжать выполнение с альтернативным путем.
- Иерархия исключений у вашего провайдера обычно богаче, чем у Spring, и нет окончательного сопоставления от одного провайдера к другому. Опираться на это опасно. Однако это хорошая идея для аннотирования ваших DAO
@Repository
, так как bean-компоненты будут автоматически добавлены процедурой сканирования. Кроме того, Spring может добавлять в аннотацию другие полезные функции.
Весна-JDBC
Spring-JDBC предоставляет класс JdbcTemplate, который удаляет соединительный код и помогает вам сосредоточиться на запросе и параметрах SQL. Вам просто нужно настроить его с помощью a DataSource
, а затем вы можете написать такой код:
int nbRows = jdbcTemplate.queryForObject("select count(1) from person", Integer.class);
Person p = jdbcTemplate.queryForObject("select first, last from person where id=?",
rs -> new Person(rs.getString(1), rs.getString(2)),
134561351656L);
Spring-JDBC также предоставляет поддержку JdbcDaoSupport, которую вы можете расширить для разработки своего DAO. Он в основном определяет 2 свойства: DataSource и JdbcTemplate, которые можно использовать для реализации методов DAO. Он также предоставляет преобразователь исключений из исключений SQL в Spring DataAccessExceptions.
Если вы планируете использовать простой jdbc, вам понадобится именно этот модуль.
Spring-ORM
Spring-ORM - это зонтичный модуль, охватывающий многие технологии сохранения, а именно JPA, JDO, Hibernate и iBatis. Для каждой из этих технологий Spring предоставляет классы интеграции, так что каждую технологию можно использовать в соответствии с принципами настройки Spring и плавно интегрировать с управлением транзакциями Spring.
Для каждой технологии конфигурация в основном заключается во внедрении DataSource
bean-компонента в какой-либо SessionFactory
или EntityManagerFactory
т. Д. Bean-компонент. Для чистого JDBC нет необходимости в таких классах интеграции (кроме JdbcTemplate), поскольку JDBC полагается только на DataSource.
Если вы планируете использовать ORM, например JPA или Hibernate, вам не понадобится spring-jdbc, а только этот модуль.
Spring-Data
Spring-Data - это зонтичный проект, который предоставляет общий API для определения того, как получить доступ к данным (аннотации DAO +) более общим способом, охватывающим как источники данных SQL, так и NOSQL.
Первоначальная идея состоит в том, чтобы предоставить технологию, чтобы разработчик писал интерфейс для DAO (методы поиска) и классы сущностей независимым от технологии способом и, основываясь только на конфигурации (аннотации к DAO и сущностям + конфигурация Spring, будь то xml или java), определяет технологию реализации, будь то JPA (SQL) или redis, hadoop и т. д. (NOSQL).
Если вы следуете соглашениям об именах, определенным spring для имен методов поиска, вам даже не нужно предоставлять строки запроса, соответствующие методам поиска, для самых простых случаев. В других случаях вы должны предоставить строку запроса внутри аннотаций методов поиска.
Когда контекст приложения загружен, spring предоставляет прокси для интерфейсов DAO, которые содержат весь шаблонный код, связанный с технологией доступа к данным, и вызывает настроенные запросы.
Spring-Data концентрируется на технологиях, отличных от SQL, но по-прежнему предоставляет модуль для JPA (единственная технология SQL).
Что дальше
Зная все это, вы должны решить, что выбрать. Хорошая новость заключается в том, что вам не нужно делать окончательный выбор в пользу технологии. Именно в этом и заключается сила Spring: как разработчик вы сосредотачиваетесь на бизнесе, когда пишете код, и, если вы делаете это хорошо, изменение базовой технологии - это деталь реализации или конфигурации.
- Определите модель данных с классами POJO для сущностей и методами получения / установки для представления атрибутов сущностей и отношений с другими сущностями. Вам, безусловно, нужно будет аннотировать классы и поля сущностей в зависимости от технологии, но пока для начала достаточно POJO. Просто сконцентрируйтесь на бизнес-требованиях.
- Определите интерфейсы для ваших DAO. 1 DAO охватывает ровно 1 объект, но вам определенно не понадобится DAO для каждого из них, поскольку вы должны иметь возможность загружать дополнительные объекты, перемещаясь по отношениям. Определите методы поиска, следуя строгим соглашениям об именах.
- Исходя из этого, кто-то другой может начать работу над уровнем сервисов с макетами для ваших DAO.
- Вы изучаете различные технологии персистентности (sql, no-sql), чтобы найти наиболее подходящие для ваших нужд, и выбираете одну из них. На основе этого вы аннотируете сущности и реализуете DAO (или позволяете Spring реализовать их за вас, если вы решите использовать данные spring).
- Если бизнес-требования развиваются и ваша технология доступа к данным недостаточна для их поддержки (скажем, вы начали с JDBC и нескольких сущностей, но теперь вам нужна более богатая модель данных, а JPA - лучший выбор), вам придется изменить реализацию ваших DAO, добавьте несколько аннотаций к своим сущностям и измените конфигурацию Spring (добавьте определение EntityManagerFactory). Остальная часть вашего бизнес-кода не должна иметь других последствий от вашего изменения.
Примечание: управление транзакциями
Spring предоставляет API для управления транзакциями. Если вы планируете использовать Spring для доступа к данным, вам также следует использовать Spring для управления транзакциями, поскольку они очень хорошо интегрируются друг с другом. Для каждой технологии доступа к данным, поддерживаемой spring, существует соответствующий менеджер транзакций для локальных транзакций, или вы можете выбрать JTA, если вам нужны распределенные транзакции. Все они реализуют один и тот же API, так что (еще раз) выбор технологии - это всего лишь вопрос конфигурации, которую можно изменить без дальнейшего воздействия на бизнес-код.
Примечание: документация Spring
Упомянутые вами ссылки на документацию Spring довольно старые. Вот документация к последней версии (4.1.6, охватывающей все темы):
Spring-data не является частью среды Spring. Существует общий модуль, который вам следует сначала прочитать, чтобы привыкнуть к принципам. Документацию можно найти здесь: