Java с нуля до middle
153 subscribers
56 photos
14 links
Download Telegram
Проблема 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.
Почему инкапсуляция заставляет нас использовать приватные модификаторы доступа у полей?

Если мы поставим паблик у поля, мы потеряем контроль. На картинке пример, на котором колесо с паблик диаметром не может иметь отрицательного значения, но нарушая правила инкапсуляции, мы имеет доступ к этому полю напрямую и можем выставлять туда любые значения, что приводит нас к ошибке

Делайте поля private и если можно то final, и будет все окей!
Что такое полиморфизм?

Я всегда говорю : " Один интерфейс множество реализаций"

На практике это:
- Создаем интерфейс Movable
- Создаем класс Animal и реализовываем интерфейс
- Создаем два класса Cat и Bird и наследуемся от класса Animal, переопределяем в них метод move
- В main создаем обьекты классов Cat и Bird, но ссылку указываем на наш интерфейс. Эту возможность нам предоставляет полиморфизм.
- Далее вызываем полиморфный метод move у интерфейса , который связан через наследование с нашими классами.
👍2
Records in java

В java 16 добавили records.
Records представляют классы, которые предназначены для создания неизменяемых классов данных.

На картинке создал record BirdOne, автоматически создается поле name (final), конструктор, геттер и переопределены методы equals(), hashCode() и toString().

lombok теперь можно не использовать!
Зачем нужен Optional?

Optional контейнер для того, что бы избежать NullPointerException - это исключение, которое возникает в Java, когда программа пытается выполнить операцию с null ссылкой в качестве объекта.

Заварачиваем List c помощью статического метода ofNullable(), который принимает значение в качестве аргумента и возвращает Optional, содержащий это значение, если оно не равно null, или же пустой Optional, если значение равно null.

Затем мы можем использовать метод isEmpty для проверки, содержит ли Optional null. Если isEmpty() возвращает false, то мы можем вызвать метод get() для получения содержимого Optional.

Короче, если есть риск того, что будет npe, заварачивайте обьект в optional
Задача с leetcode

Дана строка s, состоящая из слов и пробелов. Вернуть длину последнего слова в строке.

Решение в комментах
Можно ли переопределить статический метод?
Anonymous Quiz
40%
Можно
46%
Нет
Заполнить пустое место в методе action() так,
чтобы был корректно вызван метод
Anonymous Quiz
58%
super
14%
this
8%
One
20%
new One()
Задача реализовать интерфейс

Используйте мапу
https://codeshare.io/MN1x1Q

Я напишу свою завтра
Кто нибудь попробывал реализовать интерфейс?
Anonymous Poll
22%
Да
36%
Нет
53%
Новый год завтра!
Вот реализация
https://codeshare.io/eVRnWJ

Пишите, тесты, я свои напишу позже
https://codeshare.io/WdqD9E

Написал пару тестов, остальные сами пишите, если не выйдет пишите в коменты помогу.

Это совершенно типичное задание для джуна на работе, реализация интерфейса, тесты.
С Новым годом!!! 🎄
Желаю вам в новом году доучить джаву и найти работу.
Всем мир! ✌️
👍154