|
| 1 | +# Диалект {{ ydb-short-name }} для Spring Data JDBC |
| 2 | + |
| 3 | +Это руководство предназначено для использования [Spring Data JDBC](https://spring.io/projects/spring-data-jdbc) с {{ ydb-short-name }}. |
| 4 | + |
| 5 | +Spring Data JDBC является частью экосистемы [Spring Data](https://spring.io/projects/spring-data), которая предоставляет упрощенный подход к взаимодействию с реляционными базами данных посредством использования SQL и простых Java объектов. В отличие от [Spring Data JPA](https://spring.io/projects/spring-data-jpa), который построен на базе JPA (Java Persistence API), Spring Data JDBC предлагает более прямолинейный способ работы с базами данных, исключающий сложности, связанные с ORM (Object-Relational Mapping). |
| 6 | + |
| 7 | +## Установка диалекта {{ ydb-short-name }} {#install-dialect} |
| 8 | + |
| 9 | +Для интеграции {{ ydb-short-name }} с вашим проектом Spring Data JDBC потребуется добавить две зависимости: {{ ydb-short-name }} JDBC Driver и расширение Spring Data JDBC для {{ ydb-short-name }}. |
| 10 | + |
| 11 | +Примеры для различных систем сборки: |
| 12 | + |
| 13 | +{% list tabs %} |
| 14 | + |
| 15 | +- Maven |
| 16 | + |
| 17 | + ```xml |
| 18 | + <!-- Set actual versions --> |
| 19 | + <dependency> |
| 20 | + <groupId>tech.ydb.jdbc</groupId> |
| 21 | + <artifactId>ydb-jdbc-driver</artifactId> |
| 22 | + <version>${ydb.jdbc.version}</version> |
| 23 | + </dependency> |
| 24 | + |
| 25 | + <dependency> |
| 26 | + <groupId>tech.ydb.dialects</groupId> |
| 27 | + <artifactId>spring-data-jdbc-ydb</artifactId> |
| 28 | + <version>${spring.data.jdbc.ydb}</version> |
| 29 | + </dependency> |
| 30 | + ``` |
| 31 | + |
| 32 | +- Gradle |
| 33 | + |
| 34 | + ```groovy |
| 35 | + dependencies { |
| 36 | + // Set actual versions |
| 37 | + implementation "tech.ydb.dialects:spring-data-jdbc-ydb:$ydbDialectVersion" |
| 38 | + implementation "tech.ydb.jdbc:ydb-jdbc-driver:$ydbJdbcVersion" |
| 39 | + } |
| 40 | + ``` |
| 41 | + |
| 42 | +{% endlist %} |
| 43 | + |
| 44 | +## Использование {#using} |
| 45 | + |
| 46 | +После импорта всех необходимых зависимостей диалект готов к использованию. Рассмотрим простой пример Spring Data JDBC приложения. |
| 47 | + |
| 48 | +```properties |
| 49 | +spring.datasource.driver-class-name=tech.ydb.jdbc.YdbDriver |
| 50 | +spring.datasource.url=jdbc:ydb:<grpc/grpcs>://<host>:<2135/2136>/path/to/database[?saFile=file:~/sa_key.json] |
| 51 | +``` |
| 52 | + |
| 53 | +```java |
| 54 | +@Table(name = "Users") |
| 55 | +public class User implements Persistable<Long> { |
| 56 | + @Id |
| 57 | + private Long id = ThreadLocalRandom.current().nextLong(); |
| 58 | + |
| 59 | + private String login; |
| 60 | + private String firstname; |
| 61 | + private String lastname; |
| 62 | + |
| 63 | + @Transient |
| 64 | + private boolean isNew; |
| 65 | + |
| 66 | + // Конструкторы, геттеры и сеттеры |
| 67 | + |
| 68 | + @Override |
| 69 | + public Long getId() { |
| 70 | + return id; |
| 71 | + } |
| 72 | + |
| 73 | + @Override |
| 74 | + public boolean isNew() { |
| 75 | + return isNew; |
| 76 | + } |
| 77 | + |
| 78 | + public void setNew(boolean isNew) { |
| 79 | + this.isNew = isNew; |
| 80 | + } |
| 81 | +} |
| 82 | +``` |
| 83 | + |
| 84 | +Для сущности `User` таблицы `Users` создадим репозиторий: |
| 85 | + |
| 86 | +```java |
| 87 | +public interface SimpleUserRepository extends CrudRepository<User, Long> { |
| 88 | +} |
| 89 | +``` |
| 90 | + |
| 91 | +Давайте сохраним нового пользователя и проверим, что он был успешно сохранен: |
| 92 | + |
| 93 | +```java |
| 94 | +@Component |
| 95 | +public class UserRepositoryCommandLineRunner implements CommandLineRunner { |
| 96 | + |
| 97 | + @Autowired |
| 98 | + private SimpleUserRepository repository; |
| 99 | + |
| 100 | + @Override |
| 101 | + public void run(String... args) { |
| 102 | + User user = new User(); |
| 103 | + user.setLogin("johndoe"); |
| 104 | + user.setFirstname("John"); |
| 105 | + user.setLastname("Doe"); |
| 106 | + user.setNew(true); // Устанавливаем флаг новой сущности |
| 107 | + |
| 108 | + // Сохранение пользователя |
| 109 | + User savedUser = repository.save(user); |
| 110 | + |
| 111 | + // Проверка сохранения пользователя |
| 112 | + assertThat(repository.findById(savedUser.getId())).contains(savedUser); |
| 113 | + |
| 114 | + System.out.println("User saved with ID: " + savedUser.getId()); |
| 115 | + } |
| 116 | +} |
| 117 | +``` |
| 118 | + |
| 119 | +### View Index {#viewIndex} |
| 120 | + |
| 121 | +Для генерации конструкций `VIEW INDEX` из методов репозитория необходимо использовать аннотацию `@ViewIndex`. |
| 122 | +Аннотация `@ViewIndex` имеет два поля: |
| 123 | + |
| 124 | +- `indexName` - название индекса. |
| 125 | +- `tableName` - название таблицы, к которой привязан `VIEW INDEX`, особенно полезно при использовании аннотаций `@MappedCollection`. |
| 126 | + |
| 127 | +Рассмотрим простой пример с индексом таблицы Users по полю `login`: |
| 128 | + |
| 129 | +```java |
| 130 | +public interface SimpleUserRepository extends CrudRepository<User, Long> { |
| 131 | + |
| 132 | + @ViewIndex(indexName = "login_index") |
| 133 | + User findByLogin(String login); |
| 134 | +} |
| 135 | +``` |
| 136 | + |
| 137 | +Запрос, который сгенерирует этот метод, будет выглядеть следующим образом: |
| 138 | + |
| 139 | +```sql |
| 140 | +SELECT `Users`.`id` AS `id`, |
| 141 | + `Users`.`login` AS `login`, |
| 142 | + `Users`.`lastname` AS `lastname`, |
| 143 | + `Users`.`firstname` AS `firstname` |
| 144 | +FROM `Users` VIEW login_index AS `Users` |
| 145 | +WHERE `Users`.`login` = ? |
| 146 | +``` |
| 147 | + |
| 148 | +### YdbType {#ydbType} |
| 149 | + |
| 150 | +Для указания конкретного типа данных в {{ ydb-short-name }} можно использовать аннотацию `@YdbType` над полем сущности. |
| 151 | +Пример использования: |
| 152 | + |
| 153 | +```java |
| 154 | + @YdbType("Json") |
| 155 | + private String jsonColumn; |
| 156 | + @YdbType("JsonDocument") |
| 157 | + private String jsonDocumentColumn; |
| 158 | + @YdbType("Uint8") |
| 159 | + private byte uint8Column; |
| 160 | + @YdbType("Uint16") |
| 161 | + private short uint16Column; |
| 162 | + @YdbType("Uint32") |
| 163 | + private int uint32Column; |
| 164 | + @YdbType("Uint64") |
| 165 | + private long uint64Column; |
| 166 | +``` |
| 167 | + |
| 168 | +Использование аннотации `@YdbType` позволяет точно указать типы данных, поддерживаемые {{ ydb-short-name }}, что обеспечивает корректное взаимодействие с базой данных. |
| 169 | + |
| 170 | +Пример простого приложения Spring Data JDBC можно найти по [ссылке](https://github.com/ydb-platform/ydb-java-examples/tree/master/jdbc/spring-data-jdbc). |
0 commit comments