Канал для поиска исполнителей для разных задач и организации мини конкурсов
Last updated 2 месяца, 3 недели назад
Новые и перспективные Web3 игры с добычей токенов.
Чат: https://t.me/Crypto_Wolf_Chat
Правила чата смотрите в описании чата.
Все свои вопросы направляйте в чат или главному модератору чата: @Exudna_118
По теме сотрудничества: @Zombini
Last updated 2 месяца, 1 неделя назад
*🔍 *Обработка исключений с помощью Try-With-Resources в Java
В Java 7 была представлена мощная конструкция Try-With-Resources, которая значительно упрощает управление ресурсами, такими как файлы, соединения с БД или сокеты. Это улучшение позволяет автоматически закрывать ресурсы, предотвращая утечки памяти. Любые объекты, реализующие интерфейс AutoCloseable, можно безопасно использовать в блоке try. Java сама вызовет метод close() в конце блока, даже если произошло исключение.
*📌 *Преимущества:
- Нет необходимости в блоках finally для ручного закрытия ресурсов.
- Можно использовать несколько ресурсов в одном блоке try.
- Исключает риск утечек, особенно при работе с внешними ресурсами.
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
String line = reader.readLine();
System.out.println(line);
} catch (IOException e) {
e.printStackTrace();
}
Этот подход не только уменьшает количество шаблонного кода, но и делает обработку исключений более предсказуемой. Для более сложных систем, где важно управление ресурсами, Try-With-Resources становится незаменимым инструментом.
💡 Try-With-Resources может комбинироваться с собственными классами, реализующими AutoCloseable, чтобы управлять закрытием любых типов ресурсов.
*💥 *Волшебные методы в Spring Data JPA: скрытые возможности работы с данными
В Spring Data JPA можно создавать "волшебные" методы в репозиториях, которые автоматически генерируют SQL-запросы на основе имени метода. Это очень мощный инструмент, который ускоряет разработку и упрощает работу с базой данных. Вместо написания SQL-запросов вручную, достаточно правильно написать название метода, и фреймворк создаст нужный SQL запрос.
*🔵 *Примеры возможностей:
1️⃣ Поиск по полю:
Метод:
findByEmail(String email)
Генерируемый запрос:
SELECT * FROM users WHERE email = ?;
2️⃣ Комбинирование условий (с помощью AND и OR):
Метод:
findByFirstNameAndLastName(String firstName, String lastName)
Генерируемый запрос:
SELECT * FROM users WHERE first\_name = ? AND last\_name = ?;
Метод:
findByAgeOrSalary(int age, int salary)
Генерируемый запрос:
SELECT * FROM users WHERE age = ? OR salary = ?;
3️⃣ Диапазоны значений:
Метод:
findByAgeBetween(int startAge, int endAge)
Генерируемый запрос:
SELECT * FROM users WHERE age BETWEEN ? AND ?;
4️⃣ Сравнение значений:
Метод:
findBySalaryGreaterThan(int salary)
Генерируемый запрос:
SELECT * FROM users WHERE salary > ?;
5️⃣Сортировка результатов:
Метод:
findByLastNameOrderByFirstNameAsc(String lastName)
Генерируемый запрос:
SELECT * FROM users WHERE last\_name = ? ORDER BY first\_name ASC;
6️⃣ Частичное совпадение:
Метод:
findByNameContaining(String keyword)
Генерируемый запрос:
SELECT * FROM users WHERE name LIKE '%?%';
7️⃣ Работа с NULL:
Метод:
findByMiddleNameIsNull()
Генерируемый запрос:
SELECT * FROM users WHERE middle\_name IS NULL;
8️⃣ Ограничение количества записей:
Метод:
findTop3BySalaryGreaterThan(int salary)
Генерируемый запрос:
SELECT * FROM users WHERE salary > ? LIMIT 3;
9️⃣ Поиск по коллекции значений:
Метод:
findByRoleIn(List<String> roles)
Генерируемый запрос:
SELECT * FROM users WHERE role IN (?);
⚠️ Недостатки использования волшебных методов:
- Ограниченная гибкость: Когда запросы становятся сложными, волшебные методы перестают быть удобными. Например, сложно создать метод для многоступенчатых операций, объединений или работы с подзапросами.
- Трудности с оптимизацией: Автоматически сгенерированные SQL-запросы могут быть не такими оптимальными, как вручную написанные. Это может негативно влиять на производительность приложения, особенно при работе с большими объёмами данных.
- Неочевидность логики: В сложных проектах имя метода может становиться длинным и трудночитаемым. Это усложняет понимание логики запроса, что может запутать других разработчиков, работающих с кодом.
- Отсутствие контроля: Разработчик не всегда контролирует точную структуру генерируемого запроса, что может привести к неожиданным результатам, особенно если в базе данных есть индексы или другие особенности структуры.
*🔼*Полезные советы:
- Используйте волшебные методы для простых запросов и CRUD-операций.
- Для более сложных случаев лучше использовать @Query и писать запросы вручную.
*ℹ️ *Что такое @Transactional в Spring?
@Transactional — это аннотация, которая управляет транзакциями в Spring. Она позволяет автоматически начать, зафиксировать или откатить транзакцию при выполнении бизнес-логики. Применяется к методам или классам, где важно обеспечить целостность данных.
*🔹 Как работает:*
Когда метод помечен @Transactional, Spring создает прокси-объект, который начинает транзакцию до выполнения метода и завершает её после. В случае исключения транзакция откатывается, если оно не является проверяемым (checked exception).
*🔹 Конфигурации @Transactional:*
▪️ Propagation (распространение):
- REQUIRED (по умолчанию): метод должен выполняться в существующей транзакции, если она есть, иначе создается новая.
- REQUIRES_NEW: всегда создает новую транзакцию, приостанавливая текущую.
- SUPPORTS: метод может выполняться в транзакции, но не требует её обязательного наличия.
- MANDATORY: требует существования транзакции, иначе будет выброшено исключение.
- NOT_SUPPORTED: метод выполняется без транзакции, даже если она существует.
- NEVER: запрещает выполнение метода в транзакции, иначе выбрасывается исключение.
- NESTED: позволяет создавать вложенные транзакции, которые могут быть откатаны отдельно от внешней.
▪️ Isolation (изолированность):
- DEFAULT: уровень изоляции БД по умолчанию.
- READ_UNCOMMITTED: минимальная изоляция, позволяет читать незавершенные изменения.
- READ_COMMITTED: запрещает чтение незавершенных транзакций.
- REPEATABLE_READ: гарантирует, что данные не изменятся во время транзакции.
- SERIALIZABLE: максимальная изоляция, исключает фантомные записи.
▪️ Timeout и Rollback:
timeout: ограничивает время выполнения транзакции (по умолчанию бесконечно).
rollbackFor/noRollbackFor: настраивают, какие исключения должны вызвать откат или нет.
*🔹 Когда @Transactional не сработает?*
- @Transactional не срабатывает, если метод с этой аннотацией вызывается внутри другого метода того же класса. Это связано с тем, что Spring использует прокси для управления транзакциями, и он активируется только при внешних вызовах. Когда метод вызывается из другого метода того же класса, прокси не задействуется, и транзакция не будет создана.
- Также нужно помнить, что аннотация не работает с private методами.
*✍️*✍️ Переписывая историю: от инструментов версионирования БД к практике**
Версионирование баз данных — это меры и процедуры для поддержания консистентности данных и схемы на протяжении всего жизненного цикла приложения. По мере изменения требований к приложению, меняются и требования к данным, и в этот момент необходимо прибегнуть к их версионированию.
Продолжение здесь
*?*? Неожиданности в авторизации. Что скрывает Keycloak?**
Авторизация и регистрация пользователей — важная часть приложения как для юзеров, так и для безопасности. Но какие неожиданности содержит исходный код популярного Open Source решения для авторизации, и как они могут повлиять на работу приложения?
Продолжение тут
Канал для поиска исполнителей для разных задач и организации мини конкурсов
Last updated 2 месяца, 3 недели назад
Новые и перспективные Web3 игры с добычей токенов.
Чат: https://t.me/Crypto_Wolf_Chat
Правила чата смотрите в описании чата.
Все свои вопросы направляйте в чат или главному модератору чата: @Exudna_118
По теме сотрудничества: @Zombini
Last updated 2 месяца, 1 неделя назад