Java for Beginner
675 subscribers
559 photos
156 videos
12 files
856 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Подробный разбор решения задачи Task151124_2

1. Контекст задачи:

Эта задача демонстрирует использование Spring JDBC и JdbcTemplate для выполнения CRUD операций. В частности, в задаче показано, как с помощью JdbcTemplate можно создавать таблицы, вставлять данные, выполнять запросы и обрабатывать результаты с помощью RowMapper.


2. Ключевые элементы кода

Аннотация @SpringBootApplication:
@SpringBootApplication указывает, что Main151124_2 — это основной класс Spring Boot приложения. Она включает в себя @Configuration, @EnableAutoConfiguration и @ComponentScan, автоматически настраивая приложение и его компоненты, включая JdbcTemplate.

Аннотация @Bean и CommandLineRunner:
Метод demo() возвращает CommandLineRunner, который выполняется после запуска приложения. Это удобный способ выполнять код и тестировать логику работы с базой данных сразу после старта приложения.

JdbcTemplate:
JdbcTemplate предоставляет высокоуровневый API для работы с реляционными базами данных. Он упрощает выполнение SQL-запросов, управление соединениями и обработку результатов.
Методы execute и update используются для выполнения SQL-команд и вставки данных в таблицу.


Создание таблицы и вставка данных:
jdbcTemplate.execute("CREATE TABLE users ...") создает таблицу users с полями id, name и age.
jdbcTemplate.update("INSERT INTO users ...") вставляет две записи в таблицу: "Alice", 30 и "Bob", 25.


Запрос и использование RowMapper:
jdbcTemplate.query("SELECT name FROM users WHERE age > ?", new Object[]{20}, new NameRowMapper()) выполняет SELECT-запрос для получения имен пользователей с возрастом больше 20.
NameRowMapper реализует интерфейс RowMapper и используется для маппинга результатов запроса к объектам типа String. В данном случае, метод mapRow извлекает значение колонки name.


3. Сценарий работы программы

Запуск приложения:
Программа запускается с помощью SpringApplication.run(Main151124_2.class, args);, и Spring Boot настраивает встроенные компоненты, включая JdbcTemplate.

Выполнение операций с базой данных:
После запуска приложение создает таблицу users.
Затем добавляет две записи в таблицу:
Alice, возраст 30
Bob, возраст 25
Выполняется запрос SELECT name FROM users WHERE age > 20, который выбирает имена всех пользователей с возрастом больше 20.


Обработка результатов:
Запрос возвращает два имени: "Alice" и "Bob".
NameRowMapper преобразует строки результатов в объекты типа String.
Метод forEach выводит имена в консоль.


Вывод программы:
В консоль выводятся имена пользователей:
Alice
Bob


4. Ключевые моменты и выводы

Использование JdbcTemplate для работы с базой данных:
JdbcTemplate предоставляет удобные методы для выполнения SQL-запросов и управления результатами, устраняя необходимость ручного управления соединениями и обработкой исключений.

Создание и выполнение запросов:
execute используется для выполнения SQL-команд, таких как создание таблиц.
update подходит для выполнения операций вставки, обновления и удаления данных.
query используется для выполнения SELECT-запросов с маппингом результатов с помощью RowMapper.


RowMapper для преобразования результатов:
RowMapper преобразует строки результатов SQL-запросов в объекты Java. Это позволяет удобно обрабатывать данные и возвращать их в желаемом формате.

Валидация запросов и данных:
Запрос SELECT name FROM users WHERE age > 20 корректно выбирает всех пользователей, соответствующих условию, и возвращает их имена.

#Solution_TasksSpring
Подробный разбор решения задачи Task211124_2

1. Контекст задачи:

Задача демонстрирует использование Spring Data JPA для работы с базой данных. В частности, она показывает, как использовать аннотации JPA (@Entity, @Table, @Id) для определения сущностей, а также JpaRepository для выполнения CRUD операций и запросов с использованием JPQL. Основное внимание уделяется выполнению операций сохранения и выборки данных.

2. Ключевые элементы кода:

Аннотация @SpringBootApplication:
Указывает, что класс Main211124_2 является главным классом Spring Boot приложения. Она включает в себя @Configuration, @EnableAutoConfiguration, и @ComponentScan, что автоматически настраивает компоненты Spring, включая Spring Data JPA.

Аннотация @Entity:
Класс User2111 помечен аннотацией @Entity, что указывает JPA, что этот класс соответствует таблице в базе данных. Он представляет собой сущность, с которой будет работать JPA.
Аннотация
@Table(name = "users2111"):
Определяет, что эта сущность будет сопоставлена с таблицей users2111 в базе данных. Если аннотация @Table не указана, JPA по умолчанию использует имя класса как имя таблицы.

Аннотация @Id и @GeneratedValue:
Поле id помечено как первичный ключ с помощью аннотации @Id.
Аннотация
@GeneratedValue(strategy = GenerationType.AUTO) указывает, что значение для поля id будет генерироваться автоматически (обычно с использованием автоинкремента в базе данных).

Интерфейс UserRepository2111 и аннотация @Repository:
UserRepository2111 расширяет JpaRepository, что предоставляет стандартные методы CRUD (например, save, findAll, deleteById).
Метод findByAgeGreaterThan(int age) позволяет выполнять JPQL-запрос для получения всех пользователей, у которых возраст больше заданного.


Использование CommandLineRunner:
CommandLineRunner используется для выполнения кода сразу после запуска приложения. В данном случае он выполняет следующие шаги:
Сохраняет в базу данных двух пользователей: "Alice" с возрастом 30 и "Bob" с возрастом 25.
Выполняет запрос findByAgeGreaterThan(20), возвращающий всех пользователей с возрастом больше 20.
Выводит имена выбранных пользователей в консоль.


3. Сценарий работы программы:

Запуск приложения:
Программа запускается с помощью SpringApplication.run(Main211124_2.class, args);. Spring Boot настраивает подключение к базе данных и компоненты Spring Data JPA.

Вставка данных:
Метод save() из JpaRepository используется для сохранения двух записей:
User2111("Alice", 30)
User2111("Bob", 25)


Выполнение запроса:
Метод findByAgeGreaterThan(20) выбирает всех пользователей, у которых возраст больше 20. Это JPQL-запрос, автоматически формируемый Spring Data JPA на основе имени метода.

Вывод данных:
Полученные записи проходят через метод forEach, который вызывает System.out.println для вывода имен в консоль.

4. Ключевые моменты и выводы:

Использование JPA и Spring Data:

Spring Data JPA значительно упрощает работу с базой данных, предоставляя готовые методы для выполнения CRUD операций и поддерживая создание запросов на основе имен методов.

Аннотации JPA:
@Entity и @Table используются для связывания класса с таблицей в базе данных.
@Id и
@GeneratedValue обеспечивают автоматическую генерацию уникальных идентификаторов для каждой записи.

JPQL-запросы и JpaRepository:
Метод findByAgeGreaterThan демонстрирует, как можно выполнять запросы к базе данных, просто определяя метод с соответствующим именем в репозитории.

Гибкость CommandLineRunner:
Использование CommandLineRunner позволяет запускать код после загрузки контекста Spring, что удобно для тестирования операций с базой данных.

#Solution_TasksSpring
Подробный разбор решения задачи Task291124_2

1. Контекст задачи

Задача исследует использование аннотаций Spring для работы с кешированием (
@Cacheable, @CacheEvict) и транзакциями (@Transactional). Также рассматривается, как Spring управляет кешем, обрабатывает транзакции и вызывает базовые CRUD операции.

2. Ключевые элементы кода

Аннотация
@SpringBootApplication:
Указывает, что Task291124_2 — это основной класс Spring Boot приложения. Он автоматически настраивает компоненты приложения, включая механизмы кеширования и управления транзакциями.

Аннотация
@EnableCaching:
Разрешает проведение кеширования. Без включения @EnableCaching Spring не активирует кеширование, и @Cacheable не работает.

Аннотация
@Service:
UserService2911 помечен как сервисный компонент, что делает его доступным в контексте Spring для внедрения зависимостей.

Кеширование с помощью аннотаций
@Cacheable и @CacheEvict:
@Cacheable("users"): Метод getUserById(Long id) кеширует результат выполнения с ключом, основанным на значении параметра id. Если вызов осуществляется с тем же id, результат извлекается из кеша, и метод повторно не выполняется.
@CacheEvict(value = "users", allEntries = true): Метод clearCache() очищает кеш для всех записей в кеше users.

Транзакционное управление с помощью
@Transactional:
Метод updateUser(Long id, String newName) помечен как транзакционный. Если во время выполнения метода происходит исключение, транзакция откатывается, и изменения в базе данных не применяются.

Симуляция базы данных:
Данные хранятся в объекте Map<Long, String> database, который используется как простая "база данных". В данном случае только один пользователь (Alice) с id = 1L изначально добавлен в "базу".

Использование CommandLineRunner:
Метод demo() выполняет тестовый код сразу после запуска приложения. Он вызывает методы getUserById() и clearCache(), демонстрируя поведение кеширования.

3. Сценарий работы программы

Запуск приложения:
Программа запускается через
SpringApplication.run(Main2911.class, args);, и Spring Boot автоматически настраивает кеширование, транзакции и остальные компоненты приложения.

Первый вызов getUserById(1L):
Метод getUserById(1L) вызывается первый раз. Поскольку кеш для ключа 1L еще не существует, данные извлекаются из "базы данных" (Map), выводится:
Fetching user from database...

Результат ("Alice") добавляется в кеш и возвращается.

Второй вызов getUserById(1L):
Метод вызывается снова с тем же параметром 1L. Поскольку результат уже находится в кеше, он извлекается из кеша без повторного обращения к "базе данных". Никакого сообщения о запросе к базе данных не выводится, а результат ("Alice") возвращается напрямую.

Вызов clearCache():
Метод clearCache() вызывается, что очищает кеш для всех записей в кеше users. В консоль выводится сообщение:
Cache cleared


Третий вызов getUserById(1L):
После очистки кеша метод снова вызывается с параметром 1L. Поскольку кеш был очищен, данные снова извлекаются из "базы данных".
Вывод:
Fetching user from database...

Результат ("Alice") возвращается и снова кешируется.

4. Ключевые моменты и выводы

Механизм кеширования:
Аннотация
@Cacheable кеширует результат выполнения метода, что предотвращает повторное выполнение, если запрос уже был обработан ранее.
Аннотация
@CacheEvict используется для очистки кеша. В данном случае allEntries = true очищает все записи в кеше users.

Транзакционное управление:
Метод updateUser() не используется в задаче, но он демонстрирует работу транзакций. Если в процессе обновления пользовательского имени возникает исключение (например, при передаче null), транзакция откатывается, и изменения в базе данных не применяются.

Проверка работы кеша:
Первый вызов метода getUserById() выполняет запрос к "базе данных", а второй использует кеш.
После вызова clearCache() кеш очищается, и следующий вызов метода снова выполняет запрос к базе.

#Solution_TasksSpring
Подробный разбор решения задачи Task041224_2

1. Контекст задачи

Задача демонстрирует основы аспектно-ориентированного программирования (AOP) в Spring. Она показывает, как использовать аннотации AOP (@Before, @After, @Around) для внедрения дополнительного поведения в методы без изменения их исходного кода. Основное внимание уделяется порядку выполнения советов (Advice) и их взаимодействию.

2. Ключевые элементы кода

Аннотация @SpringBootApplication:
Указывает, что класс Main041224_2 является главным классом Spring Boot приложения. Она включает в себя @Configuration, @EnableAutoConfiguration, и @ComponentScan, что автоматически настраивает компоненты Spring, включая поддержку AOP.

Аннотация @EnableAspectJAutoProxy:
Включает поддержку прокси AspectJ, что необходимо для применения аспектов.

Класс Service0412:
Содержит метод performTask(), который выводит сообщение "Executing performTask...". Этот метод становится целью для аспектов.

Класс LoggingAspect0412:
Определен как аспект с помощью аннотации @Aspect.

Он содержит три совета:

@Before:
Метод logBefore() выполняется перед вызовом performTask() и выводит "Before advice".

@After:
Метод logAfter() выполняется после завершения performTask() и выводит "After advice".

@Around:
Метод logAround() оборачивает выполнение performTask():

Выводит "Around: Before" перед вызовом целевого метода.
Выполняет целевой метод с помощью joinPoint.proceed().
Выводит "Around: After" после выполнения метода.


3. Сценарий работы программы

Запуск приложения:
Программа запускается с помощью SpringApplication.run(Main041224_2.class, args);. Контекст Spring создает прокси для Service0412, обеспечивая применение аспектов.

Вызов performTask():
Метод вызывается из CommandLineRunner, что приводит к активации всех аспектов.

Последовательность выполнения:

@Around (первый вызов) — выводит "Around: Before".
@Before — выводит "Before advice".
Выполняется performTask(), выводя "Executing performTask...".
@After — выводит "After advice".
@Around (второй вызов) — выводит "Around: After".

4. Ключевые моменты и выводы

Порядок выполнения советов:
@Around оборачивает выполнение метода, выводя сообщения до и после вызова.
@Before выполняется после первой части @Around, но перед вызовом целевого метода.
@After выполняется после выполнения целевого метода, но до завершения второй части @Around.

Взаимодействие аспектов:
Аспекты работают вместе, добавляя дополнительное поведение. Это позволяет гибко управлять процессом выполнения методов.

Использование прокси:
Аспекты применяются к методам через прокси, что позволяет Spring перехватывать вызовы методов и применять советы.

#Solution_TasksSpring