В прошлый раз мы рассмотрели как выглядит одно и то же приложение, при использовании технологий — JDBC, Spring JDBC, Hibernate и Spring Data JPA.
Давайте теперь добавим еще технологий — Spring Data JDBC, MyBatis, JOOQ.
🌱 Spring Data JDBC — реализация ORM фреймворка от Spring. Внутри не использует Hibernate, а отправляет запросы, используя JdbcTemplate.
Имеет свои аннотации [Id, Column, MappedColleсtion и т.д.] в пакете org.springframework.data.annotation.
Поддерживает генерацию SQL на основе имени метода в репозитории.
❓ Какие отличия от Hibernate?
— Отсутствует свой язык запросов [нет JPQL, только SQL]
— Отсутствует Lazy Loading [one-to-many отношение будет получено сразу, вместе с N+1 проблемой]
— Отсутствует кеширование [не отслеживается состояние сущности. Нужно явно вызывать методы репозитория]
— По умолчанию поддерживается только тип Identity для генерации id [поддержку Sequence, UUID нужно написать самим]
— По умолчанию нет поддержки Batch операций [поддержку можно написать через свой абстрактный репозиторий]
Основным подходом является DDD [Domain-Driven Design], и понятие Aggregate является ключевым при работе с фреймворком, например:
— Нет явной поддержки many-to-one [можно получить только id связанной сущности либо объект AggregateReference]
— Нет явной поддержки many-to-many [нужно создать отдельную сущность]
— Каскадные операции применяются только для агрегата [при обновлении агрегата, дочерние сущности пересоздаются]
Пример доступен на 🐙Github
🐦 MyBatis — persistence framework. Имеет более низкоуровневый API, чем Spring Data JDBC/JPA, но более высокоуровневый, чем JDBC/Spring JDBC.
❓ Какие основные особенности?
— В качестве сущности может использоваться POJO [Plain Old Java Object]
— Вместо Repository используется понятие Mapper [имеет свой дополнительный синтаксис при написании SQL]
— Конфигурируется с помощью XML либо аннотаций
— Имеет свой генератор кода, генерирующий простой CRUD и сами сущности на основе БД
Пример доступен на 🐙Github
💡 jOOQ [java Object Oriented Querying] — библиотека, генерирующая DSL [Domain Specific Language] для работы с SQL в формате type safe через fluent API.
❓ Какие основные особенности?
— Генерирует сущности на основе БД, а также DAO классы с набором готовых методов
— Генератор гибко настраивается [можно добавить equals, hashCode. Аннотации JPA и Spring Context и т.д.]
— По умолчанию использует стратегию именования сгенерированных классов по имени таблицы [если их назвать во множественном числе, такие классы и получим. Исправить можно через свою стратегию именования]
— Иногда совмещают с более высокоуровневыми Spring Data JDBC/JPA
Пример доступен на 🐙Github
#sandbox_java_database_tools
➿ Меню
➿ Подпишись: @developer_sandbox
Давайте теперь добавим еще технологий — Spring Data JDBC, MyBatis, JOOQ.
🌱 Spring Data JDBC — реализация ORM фреймворка от Spring. Внутри не использует Hibernate, а отправляет запросы, используя JdbcTemplate.
Имеет свои аннотации [Id, Column, MappedColleсtion и т.д.] в пакете org.springframework.data.annotation.
Поддерживает генерацию SQL на основе имени метода в репозитории.
❓ Какие отличия от Hibernate?
— Отсутствует свой язык запросов [нет JPQL, только SQL]
— Отсутствует Lazy Loading [one-to-many отношение будет получено сразу, вместе с N+1 проблемой]
— Отсутствует кеширование [не отслеживается состояние сущности. Нужно явно вызывать методы репозитория]
— По умолчанию поддерживается только тип Identity для генерации id [поддержку Sequence, UUID нужно написать самим]
— По умолчанию нет поддержки Batch операций [поддержку можно написать через свой абстрактный репозиторий]
Основным подходом является DDD [Domain-Driven Design], и понятие Aggregate является ключевым при работе с фреймворком, например:
— Нет явной поддержки many-to-one [можно получить только id связанной сущности либо объект AggregateReference]
— Нет явной поддержки many-to-many [нужно создать отдельную сущность]
— Каскадные операции применяются только для агрегата [при обновлении агрегата, дочерние сущности пересоздаются]
Пример доступен на 🐙Github
🐦 MyBatis — persistence framework. Имеет более низкоуровневый API, чем Spring Data JDBC/JPA, но более высокоуровневый, чем JDBC/Spring JDBC.
❓ Какие основные особенности?
— В качестве сущности может использоваться POJO [Plain Old Java Object]
— Вместо Repository используется понятие Mapper [имеет свой дополнительный синтаксис при написании SQL]
— Конфигурируется с помощью XML либо аннотаций
— Имеет свой генератор кода, генерирующий простой CRUD и сами сущности на основе БД
Пример доступен на 🐙Github
💡 jOOQ [java Object Oriented Querying] — библиотека, генерирующая DSL [Domain Specific Language] для работы с SQL в формате type safe через fluent API.
❓ Какие основные особенности?
— Генерирует сущности на основе БД, а также DAO классы с набором готовых методов
— Генератор гибко настраивается [можно добавить equals, hashCode. Аннотации JPA и Spring Context и т.д.]
— По умолчанию использует стратегию именования сгенерированных классов по имени таблицы [если их назвать во множественном числе, такие классы и получим. Исправить можно через свою стратегию именования]
— Иногда совмещают с более высокоуровневыми Spring Data JDBC/JPA
Пример доступен на 🐙Github
#sandbox_java_database_tools
➿ Меню
➿ Подпишись: @developer_sandbox