Перейти к основному содержимому

Введение в Spring Data JDBC

· 5 мин. чтения

1. Обзор

Spring Data JDBC — это инфраструктура персистентности, которая не так сложна, как Spring Data JPA. Он не обеспечивает кеширование, отложенную загрузку, отложенную запись или многие другие функции JPA. Тем не менее, он имеет собственный ORM и предоставляет большинство функций, которые мы используем в Spring Data JPA , таких как сопоставленные объекты, репозитории, аннотации запросов и JdbcTemplate .

Важно помнить, что Spring Data JDBC не предлагает генерацию схемы . В результате мы несем ответственность за явное создание схемы.

2. Добавление Spring Data JDBC в проект

Spring Data JDBC доступен для приложений Spring Boot со стартером зависимостей JDBC. Однако этот пусковой механизм зависимости не содержит драйвер базы данных . Это решение должен принять разработчик. Давайте добавим стартер зависимостей для Spring Data JPA:

<dependency> 
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>

В этом примере мы используем базу данных H2. Как мы упоминали ранее, Spring Data JDBC не предлагает генерацию схемы. В таком случае мы можем создать собственный файл schema.sql , который будет содержать команды SQL DDL для создания объектов схемы. Spring Boot автоматически выберет этот файл и будет использовать его для создания объектов базы данных.

3. Добавление объектов

Как и в других проектах Spring Data, мы используем аннотации для сопоставления POJO с таблицами базы данных. В Spring Data JDBC сущность должна иметь @Id . Spring Data JDBC использует аннотацию @Id для идентификации сущностей.

Подобно Spring Data JPA, Spring Data JDBC по умолчанию использует стратегию именования, которая сопоставляет сущности Java с таблицами реляционной базы данных, а атрибуты — с именами столбцов. По умолчанию имена сущностей и атрибутов в Camel Case сопоставляются с именами в змеином регистре таблиц и столбцов соответственно. Например, сущность Java с именем AddressBook сопоставляется с таблицей базы данных с именем address_book .

Кроме того, мы можем явно сопоставлять сущности и атрибуты с таблицами и столбцами, используя аннотации @Table и @Column . Например, ниже мы определили сущность, которую будем использовать в этом примере:

public class Person {
@Id
private long id;
private String firstName;
private String lastName;
// constructors, getters, setters
}

Нам не нужно использовать аннотацию @Table или @Column в классе Person . Стратегия именования по умолчанию Spring Data JDBC неявно выполняет все сопоставления между сущностью и таблицей.

4. Объявление репозиториев JDBC

Spring Data JDBC использует синтаксис, аналогичный Spring Data JPA. Мы можем создать репозиторий Spring Data JDBC, расширив интерфейс Repository , CrudRepository или PagingAndSortingRepository . Реализуя CrudRepository , мы получаем реализацию наиболее часто используемых методов, таких как save , delete и findById , среди прочих.

Давайте создадим репозиторий JDBC, который мы будем использовать в нашем примере:

@Repository 
public interface PersonRepository extends CrudRepository<Person, Long> {
}

Если нам нужны функции разбиения на страницы и сортировки, лучшим выбором будет расширение интерфейса PagingAndSortingRepository .

5. Настройка репозиториев JDBC

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

Теперь давайте настроим наш PersonRepository с немодифицирующим запросом и модифицирующим запросом:

@Repository
public interface PersonRepository extends CrudRepository<Person, Long> {

List<Person> findByFirstName(String firstName);

@Modifying
@Query("UPDATE person SET first_name = :name WHERE id = :id")
boolean updateByFirstName(@Param("id") Long id, @Param("name") String name);
}

Начиная с версии 2.0 Spring Data JDBC поддерживает методы запросов . То есть, если мы назовем наш метод запроса, включая ключевые слова, например, findByFirstName, Spring Data JDBC автоматически сгенерирует объект запроса.

Однако для изменяющего запроса мы используем аннотацию @Modifying , чтобы аннотировать метод запроса, который изменяет сущность. Также украшаем его аннотацией @Query .

Внутри аннотации @Query мы добавляем нашу команду SQL. В Spring Data JDBC мы пишем запросы на простом SQL. Мы не используем язык запросов более высокого уровня, такой как JPQL. В результате приложение становится тесно связанным с поставщиком базы данных.

По этой причине также становится сложнее перейти на другую базу данных.

Одна вещь, которую мы должны иметь в виду, заключается в том, что Spring Data JDBC не поддерживает ссылку на параметры с порядковыми номерами . Мы можем ссылаться на параметры только по имени .

6. Заполнение базы данных

Наконец, нам нужно заполнить базу данных данными, которые будут использоваться для тестирования репозитория Spring Data JDBC, который мы создали выше. Итак, мы собираемся создать сеялку базы данных, которая будет вставлять фиктивные данные. Давайте добавим реализацию сеялки базы данных для этого примера:

@Component
public class DatabaseSeeder {

@Autowired
private JdbcTemplate jdbcTemplate;
public void insertData() {
jdbcTemplate.execute("INSERT INTO Person(first_name,last_name) VALUES('Victor', 'Hugo')");
jdbcTemplate.execute("INSERT INTO Person(first_name,last_name) VALUES('Dante', 'Alighieri')");
jdbcTemplate.execute("INSERT INTO Person(first_name,last_name) VALUES('Stefan', 'Zweig')");
jdbcTemplate.execute("INSERT INTO Person(first_name,last_name) VALUES('Oscar', 'Wilde')");
}
}

Как видно выше, мы используем Spring JDBC для выполнения операторов INSERT . В частности, Spring JDBC обрабатывает соединение с базой данных и позволяет нам выполнять команды SQL с помощью JdbcTemplate s. Это решение очень гибкое, потому что у нас есть полный контроль над выполняемыми запросами.

7. Заключение

Подводя итог, можно сказать, что Spring Data JDBC предлагает такое же простое решение, как использование Spring JDBC — в нем нет никакой магии. Тем не менее, он также предлагает большинство функций, к которым мы привыкли при использовании Spring Data JPA.

Одним из самых больших преимуществ Spring Data JDBC является улучшенная производительность при доступе к базе данных по сравнению с Spring Data JPA. Это связано с тем, что Spring Data JDBC взаимодействует непосредственно с базой данных . Spring Data JDBC не содержит большей части магии Spring Data при запросе к базе данных .

Одним из самых больших недостатков при использовании Spring Data JDBC является зависимость от поставщика базы данных. Если мы решим изменить базу данных с MySQL на Oracle, нам, возможно, придется столкнуться с проблемами, возникающими из-за того, что базы данных имеют разные диалекты .

Реализацию этого учебного пособия Spring Data JDBC можно найти на GitHub .