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

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:

 org.springframework.boot spring-boot-starter-data-jdbc  

В този пример използваме базата данни 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 обекти в релационни таблици на база данни и атрибути в имена на колони. По подразбиране имената на камилски случаи на обекти и атрибути се съпоставят съответно на имена на змийски случаи на таблици и колони. Например обект на 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 { }

Ако трябва да имаме функции за разбиване на страници и сортиране, най-добрият избор ще бъде да разширим интерфейса PagingAndSortingRepository .

5. Персонализиране на JDBC хранилища

Въпреки вградените методи на CrudRepository , ние трябва да създадем нашите методи за конкретни случаи. Важно е да се отбележи, че Spring Data JDBC не поддържа производни заявки . Това означава, че не можем просто да напишем името на метода и да очакваме, че Spring Data JDBC генерира заявката.

Всеки път, когато пишем персонализиран метод, трябва да го украсим с анотацията @Query . Вътре в анотацията @Query добавяме нашата SQL команда. В Spring Data JDBC пишем заявки в обикновен SQL. Не използваме език за заявки от по-високо ниво като JPQL. В резултат на това приложението става тясно свързано с доставчика на база данни.

Поради тази причина също става по-трудно да преминете към друга база данни.

Друга важна разлика е, че Spring Data JDBC не поддържа препращането на параметри с индексни номера . В тази версия на Spring Data JDBC можем да препращаме параметри само по име .

С анотацията @Modifying можем да анотираме методи за заявка, които модифицират обекта.

Сега нека персонализираме нашето PersonRepository с немодифицираща заявка и модифицираща заявка:

@Repository public interface PersonRepository extends CrudRepository { @Query("select * from person where first_name=:firstName") List findByFirstName(@Param("firstName") String firstName); @Modifying @Query("UPDATE person SET first_name = :name WHERE id = :id") boolean updateByFirstName(@Param("id") Long id, @Param("name") String name); }

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')"); } }

As seen above, we're using Spring JDBC for executing the INSERT statements. In particular, Spring JDBC handles the connection with the database and lets us execute SQL commands using JdbcTemplates. This solution is very flexible because we have complete control over the executed queries.

7. Conclusion

To summarize, Spring Data JDBC offers a solution that is as simple as using Spring JDBC — there is no magic behind it. Nonetheless, it also offers a majority of features that we're accustomed to using Spring Data JPA.

Едно от най-големите предимства на Spring Data JDBC е подобрената производителност при достъп до базата данни в сравнение с Spring Data JPA. Това се дължи на Spring Data JDBC, комуникиращи директно с базата данни . Spring Data JDBC не съдържа по-голямата част от магията Spring Data при заявки към базата данни .

Един от най-големите недостатъци при използване на Spring Data JDBC е зависимостта от доставчика на базата данни. Ако решим да променим базата данни от MySQL на Oracle, може да се наложи да се справим с проблеми, възникващи от бази данни с различни диалекти .

Реализацията на този урок за JDBC Spring Data може да бъде намерена в GitHub.