Вот введение в каждую упомянутую технологию.
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.
Для каждой технологии конфигурация в основном заключается во внедрении DataSourcebean-компонента в какой-либо 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. Существует общий модуль, который вам следует сначала прочитать, чтобы привыкнуть к принципам. Документацию можно найти здесь: