Диалект YDB для Spring Data JDBC
Это руководство предназначено для использования Spring Data JDBC с YDB.
Spring Data JDBC является частью экосистемы Spring Data, которая предоставляет упрощенный подход к взаимодействию с реляционными базами данных посредством использования SQL и простых Java объектов. В отличие от Spring Data JPA, который построен на базе JPA (Java Persistence API), Spring Data JDBC предлагает более прямолинейный способ работы с базами данных, исключающий сложности, связанные с ORM (Object-Relational Mapping).
Установка диалекта YDB
Для интеграции YDB с вашим проектом Spring Data JDBC потребуется добавить две зависимости: YDB JDBC Driver и расширение Spring Data JDBC для YDB.
Примеры для различных систем сборки:
<!-- Set actual versions -->
<dependency>
<groupId>tech.ydb.jdbc</groupId>
<artifactId>ydb-jdbc-driver</artifactId>
<version>${ydb.jdbc.version}</version>
</dependency>
<dependency>
<groupId>tech.ydb.dialects</groupId>
<artifactId>spring-data-jdbc-ydb</artifactId>
<version>${spring.data.jdbc.ydb}</version>
</dependency>
dependencies {
// Set actual versions
implementation "tech.ydb.dialects:spring-data-jdbc-ydb:$ydbDialectVersion"
implementation "tech.ydb.jdbc:ydb-jdbc-driver:$ydbJdbcVersion"
}
Использование
После импорта всех необходимых зависимостей диалект готов к использованию. Рассмотрим простой пример Spring Data JDBC приложения.
spring.datasource.driver-class-name=tech.ydb.jdbc.YdbDriver
spring.datasource.url=jdbc:ydb:<grpc/grpcs>://<host>:<2135/2136>/path/to/database[?saFile=file:~/sa_key.json]
@Table(name = "Users")
public class User implements Persistable<Long> {
@Id
private Long id = ThreadLocalRandom.current().nextLong();
private String login;
private String firstname;
private String lastname;
@Transient
private boolean isNew;
// Конструкторы, геттеры и сеттеры
@Override
public Long getId() {
return id;
}
@Override
public boolean isNew() {
return isNew;
}
public void setNew(boolean isNew) {
this.isNew = isNew;
}
}
Для сущности User
таблицы Users
создадим репозиторий:
public interface SimpleUserRepository extends CrudRepository<User, Long> {
}
Давайте сохраним нового пользователя и проверим, что он был успешно сохранен:
@Component
public class UserRepositoryCommandLineRunner implements CommandLineRunner {
@Autowired
private SimpleUserRepository repository;
@Override
public void run(String... args) {
User user = new User();
user.setLogin("johndoe");
user.setFirstname("John");
user.setLastname("Doe");
user.setNew(true); // Устанавливаем флаг новой сущности
// Сохранение пользователя
User savedUser = repository.save(user);
// Проверка сохранения пользователя
assertThat(repository.findById(savedUser.getId())).contains(savedUser);
System.out.println("User saved with ID: " + savedUser.getId());
}
}
View Index
Для генерации конструкций VIEW INDEX
из методов репозитория необходимо использовать аннотацию @ViewIndex
.
Аннотация @ViewIndex
имеет два поля:
indexName
- название индекса.tableName
- название таблицы, к которой привязанVIEW INDEX
, особенно полезно при использовании аннотаций@MappedCollection
.
Рассмотрим простой пример с индексом таблицы Users по полю login
:
public interface SimpleUserRepository extends CrudRepository<User, Long> {
@ViewIndex(indexName = "login_index")
User findByLogin(String login);
}
Запрос, который сгенерирует этот метод, будет выглядеть следующим образом:
SELECT `Users`.`id` AS `id`,
`Users`.`login` AS `login`,
`Users`.`lastname` AS `lastname`,
`Users`.`firstname` AS `firstname`
FROM `Users` VIEW login_index AS `Users`
WHERE `Users`.`login` = ?
YdbType
Для указания конкретного типа данных в YDB можно использовать аннотацию @YdbType
над полем сущности.
Пример использования:
@YdbType("Json")
private String jsonColumn;
@YdbType("JsonDocument")
private String jsonDocumentColumn;
@YdbType("Uint8")
private byte uint8Column;
@YdbType("Uint16")
private short uint16Column;
@YdbType("Uint32")
private int uint32Column;
@YdbType("Uint64")
private long uint64Column;
Использование аннотации @YdbType
позволяет точно указать типы данных, поддерживаемые YDB, что обеспечивает корректное взаимодействие с базой данных.
Пример простого приложения Spring Data JDBC можно найти по ссылке.