0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: spring, spring framework, spring data jpa, spring data jdbc, spring data repository, spring data</p>
1
<p>Теги: spring, spring framework, spring data jpa, spring data jdbc, spring data repository, spring data</p>
2
<p>Этот пост для тех, кто устал писать запросы в<strong>JDBC template</strong>и хочет мощи, которая есть в<strong>Spring Data JPA</strong>-репозиториях, но не может/не готов использовать<strong>JPA</strong>. А также для тех, кто устал разрабатывать сущности с<strong>JPA/Hibernate</strong>и хочет более душевного и близкого "к железу" SQL. Как ни странно, но для решения этих противоречивых с первого взгляда вопросов есть один способ -<strong>Spring Data JDBC</strong>.</p>
2
<p>Этот пост для тех, кто устал писать запросы в<strong>JDBC template</strong>и хочет мощи, которая есть в<strong>Spring Data JPA</strong>-репозиториях, но не может/не готов использовать<strong>JPA</strong>. А также для тех, кто устал разрабатывать сущности с<strong>JPA/Hibernate</strong>и хочет более душевного и близкого "к железу" SQL. Как ни странно, но для решения этих противоречивых с первого взгляда вопросов есть один способ -<strong>Spring Data JDBC</strong>.</p>
3
<h2>Что такое Spring Data JDBC?</h2>
3
<h2>Что такое Spring Data JDBC?</h2>
4
<p>Для начала: • Это не<strong>ORM</strong>в классическом понимании; • Но это полноценный<strong>Spring Data Repository</strong>; • Не имеет никакого отношения к<strong>JPA</strong>, но схож по своей природе; • По сути,<strong>JdbcTemplate</strong>, обёрнутый в Spring Data; • Скорее, это<strong>MyBatis</strong>, и, кстати, поддержка его имеется.</p>
4
<p>Для начала: • Это не<strong>ORM</strong>в классическом понимании; • Но это полноценный<strong>Spring Data Repository</strong>; • Не имеет никакого отношения к<strong>JPA</strong>, но схож по своей природе; • По сути,<strong>JdbcTemplate</strong>, обёрнутый в Spring Data; • Скорее, это<strong>MyBatis</strong>, и, кстати, поддержка его имеется.</p>
5
<p>Итак, рассмотрим пример репозитория на Spring Data. Как и все Spring Data репозитории, они начинаются с доменного класса:</p>
5
<p>Итак, рассмотрим пример репозитория на Spring Data. Как и все Spring Data репозитории, они начинаются с доменного класса:</p>
6
@Table("persons") public class Person { @Id private int id; @Column("name") private String name; // Конструкторы, геттеры и сеттеры (хотя сеттеры по документации не нужны) }<p>Обратите внимание на аннотацию org.springframework.data.annotation.Id - это стандартная Spring Data аннотация для обозначения поля с ID. Кстати, она активно используется при работе с<strong>NoSQL</strong>базами данных.</p>
6
@Table("persons") public class Person { @Id private int id; @Column("name") private String name; // Конструкторы, геттеры и сеттеры (хотя сеттеры по документации не нужны) }<p>Обратите внимание на аннотацию org.springframework.data.annotation.Id - это стандартная Spring Data аннотация для обозначения поля с ID. Кстати, она активно используется при работе с<strong>NoSQL</strong>базами данных.</p>
7
<p>org.springframework.data.relational.core.mapping.@Table и @Column - это, как ни странно, не JPA аннотации, а как раз аннотации<strong>Spring Data JDBC</strong>. Нетрудно догадаться, что эти аннотации (и без их наличия тоже) задают однозначно таблицы и колонки, из которых и будут браться сущности и данные.</p>
7
<p>org.springframework.data.relational.core.mapping.@Table и @Column - это, как ни странно, не JPA аннотации, а как раз аннотации<strong>Spring Data JDBC</strong>. Нетрудно догадаться, что эти аннотации (и без их наличия тоже) задают однозначно таблицы и колонки, из которых и будут браться сущности и данные.</p>
8
<p>Рассмотрим непосредственно репозиторий в лучших традициях Spring Data:</p>
8
<p>Рассмотрим непосредственно репозиторий в лучших традициях Spring Data:</p>
9
interface PersonRepository extends CrudRepository<Person, Long> {}<p>Собственно, всё! Предлагаю читателям самостоятельно убедиться, что этого достаточно для определения информации маппинга полей.</p>
9
interface PersonRepository extends CrudRepository<Person, Long> {}<p>Собственно, всё! Предлагаю читателям самостоятельно убедиться, что этого достаточно для определения информации маппинга полей.</p>
10
<h2>А как писать запросы?</h2>
10
<h2>А как писать запросы?</h2>
11
<p>Этим и занимается аннотация<strong>@Query</strong>, которую мы можем использовать и здесь:</p>
11
<p>Этим и занимается аннотация<strong>@Query</strong>, которую мы можем использовать и здесь:</p>
12
interface PersonRepository extends CrudRepository<Person, Long> { @Query("SELECT p.id, p.name FROM person p") public List<Person> getAll(); }<p>Пользуйтесь мощью чистого SQL!</p>
12
interface PersonRepository extends CrudRepository<Person, Long> { @Query("SELECT p.id, p.name FROM person p") public List<Person> getAll(); }<p>Пользуйтесь мощью чистого SQL!</p>
13
<p><em>Хочется узнать больше? Задавайте вопросы в комментариях!</em></p>
13
<p><em>Хочется узнать больше? Задавайте вопросы в комментариях!</em></p>
14
14