Java с нуля до middle
153 subscribers
56 photos
14 links
Download Telegram
Sql от chatgpt

Сгенерировал селект, по запросу: самый сложный запрос к бд, который ты можешь сделать.

Если расшифровал что делает селект, пиши в комменты.

Следующий уровень: сделайте explain analyse и найдите в нем не оптимальные места и как его можно улучшить
Фабрика бинов

Для создания фабрики 🏭бинов в Spring можно использовать конфигурационный класс с аннотацией @Configuration. В нем необходимо определить методы, которые будут создавать бины с помощью аннотации @Bean.

В данном случае конфигурационный класс BeanFactory содержит два метода-определения бинов: exampleService и dependency. Каждый из них создает экземпляр соответствующего класса и возвращает его.

После этого можно использовать бины в приложении с помощью аннотации @Autowired или через конструктор, что предпочтительнее внедряя 💉их через конструктор!
Динамическое прокси в Java
Cпособ создания прокси-объекта, который позволяет динамически реализовывать интерфейсы во время выполнения.

Это означает, что вы можете использовать динамическое прокси, чтобы создать объект, который реализует интерфейсы, которые вы можете определить во время выполнения. Это может быть полезно в случаях, когда вы хотите создать объекты с динамически изменяемым поведением.

Пример тут:
https://javarush.com/groups/posts/2281-dinamicheskie-proksi
Жизненный цикл бина в контейнере

Когда контейнер запускается, он создает бин, инициализирует его и вызывает метод инициализации.
Затем контейнер использует бин для выполнения запросов и предоставления услуг.
Когда контейнер завершает работу, он вызывает метод завершения для бина, а затем уничтожает его.
Область видимости — scope.
Существует 2 области видимости по умолчанию

Singleton
Область видимости по умолчанию. В контейнере находится 1 экземпляр бина

Prototype
В контейнере может находится любое количество экземпляров бина

Есть еще четыре скопа в веб приложении, но об этом позже
Что такое BeanFactoryPostProcessor?

Интерфейс который позволяет менять конфиг бинов после их создания

На картинке нейронка поменяла скоуп у бина
Для чего был создан REST?

Representation
- ресурсы могут быть представлены в любой форме xml, json

State - концентрация на состоянии ресурса, а не на действии с ним

Transfer - передача ресурсных данных
👍1
Что такое идемпотентный метод?

Это метод при вызове которого результат будет одинаковый.
То есть результат после вызова 1 такого метода будет таким же, как и результат после 10ти вызовов этого метода.

Например, если клиент обновляет профиль на сайте и нажимает кнопку обновить, и он это делает случайно несколько раз, идемпотентный PUT срабатывает только один раз.

POST - для создания
PUT - для обновления

Безопасным этот метод считается, когда его вызов не изменяет состояние данных.
👍1
Что такое Hibernate?

Это фреймворк для Java, который предоставляет решения для работы с базами данных через объектно-реляционное отображение (ORM).

Он позволяет работать с базами данных, используя объекты Java вместо SQL-запросов.

Hibernate автоматически обрабатывает многие детали работы с базами данных, такие как управление соединениями, транзакциями и кешированием
👍1
Проблема N+1

Возникает при работе с базами данных, когда система делает отдельный запрос к базе данных для каждого объекта, который необходимо загрузить.

Например, у вас есть система, которая работает с базой данных сотрудников. Вы можете иметь сущность "Отдел", которая связана с несколькими сущностями "Сотрудник".
При запросе списка всех отделов система может сделать один запрос к базе данных, чтобы получить список всех отделов, а затем для каждого отдела делать отдельный запрос к базе данных, чтобы получить список сотрудников в этом отделе.
Это приведет к созданию N+1 запросов, где N - число отделов.

Для того, чтобы избежать N+1 используйте @ BatchSize или join fetch, более подробно в этой статье:
https://sysout.ru/n-1-problema-v-hibernate/
🔥3
Пример приложения Java Persistence API (JPA) с использованием реализации Hibernate

Класс User аннотирован @Entity, чтобы указать, что это JPA-сущность. Аннотация @Table указывает название таблицы базы данных, которая будет использоваться для сохранения сущности.

Аннотация @Id указывает на первичный ключ сущности, а аннотация @GeneratedValue указывает, что значение первичного ключа будет сгенерировано автоматически базой данных.

Аннотация @Column используется для указания сопоставления между полями сущности и столбцами в таблице базы данных.

Класс UserDao является простым объектом доступа к данным, который предоставляет базовые операции CRUD для сущности User. Менеджер сущностей (EntityManager) внедряется с помощью аннотации @PersistenceContext и используется для взаимодействия с базой данных.
JPA (Java Persistence API)

Cпецификация для управления и хранения данных Java-объектов в реляционных базах данных. Она определяет стандартный способ для управления данными в Java-приложениях, используя объектно-реляционное отображение (ORM).

JPA предоставляет набор интерфейсов и аннотаций, которые позволяют определить сущности (entities) в приложении и связи между ними. Он также определяет способы управления транзакциями, кешированием и выполнением запросов.

JPA является стандартом Java Enterprise Edition (Java EE), и его реализации, например Hibernate.
🔥1
DAO (Data Access Object)

Паттерн проектирования, который используется для определения интерфейса, через который приложение может получать доступ к данным. Он предоставляет абстрактный уровень между приложением и хранилищем данных, позволяя приложению изолироваться от способа хранения и представления данных.

Обычно DAO определяет набор методов для выполнения операций с данными, таких как создание, чтение, обновление и удаление. Он может использовать различные технологии для хранения и получения данных, например, JDBC, Hibernate, JPA.

DAO обычно реализуется как отдельный слой в архитектуре приложения, который служит для управления данными и обеспечивает разделение слоев в приложении.
Задача на циклы

Дано целое число N и последовательность из N целых чисел. Найти второй по минимальности элемент.

Решение в комментах
Что такое EntityManager?
Главный API для работы с JPA

Основные операции над Entity:

persist - добавление Entity под управление JPA
merge - метод для слияния существующей, если сущность не существует в контексте сущностей, то она будет добавлена
remove - удаление
refresh - обновление данных
detach - удаление из управление JPA
Зачем создали JPQL (Java Persistence Query Language) и почему не использовать SQL всегда?

jpql выполняет запросы на уровне объектов, а не таблиц, самое жирное преимущество,
то что он не привязан к какой конкретной бд, но на практике это нужно довольно редко.

jpql использует имена классов, sql имена таблиц и столбцов.

По факту jpql имеет ограничения по группировке и агрегированию по сравнению с sql.
Но у EntityManager есть много удобным методов и часто, если в проекте не spring data,
то используют jpql.

На картинке пример простого селекта.

В этом примере Person - это имя класса-сущности, а p - это псевдоним, который используется в запросе вместо имени класса. Запрос выбирает все объекты класса Person, у которых свойство age больше или равно 18, и возвращает их в списке adults.

Этот запрос может быть выполнен с помощью метода createQuery EntityManager и передачи ему строки JPQL. Затем можно дабавить результаты в List помощью метода getResultList.