Skip to content

ТЗ 12#3

Merged
LevshaKS merged 15 commits into
mainfrom
add-database
Jun 7, 2025
Merged

ТЗ 12#3
LevshaKS merged 15 commits into
mainfrom
add-database

Conversation

@LevshaKS
Copy link
Copy Markdown
Owner

No description provided.

Copy link
Copy Markdown

@avfyodorov avfyodorov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Добрый вечер, Константин!

В целом хорошо, правда, есть ряд уточнений.

public void addGenre(long filmId, Set<Genre> genreSet) {
try {
for (Genre genre : genreSet) {
jdbc.update("INSERT INTO genre(film_id, genre_id) VALUES(?,?)", filmId, genre.getId());
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В этом месте, в цикле, всё время дёргается база данных. Было бы хорошо избавиться от этих многочисленных запросов, которые сильно нагружают сервер. Хорошо было бы сохранить данные одним запросом, например, с помощью конструкции:
jdbcTemplate.batchUpdate(............

import java.util.stream.Collectors;

@Repository
public class InMemoryFilmStorage extends Storage<Film> implements FilmStorage<Film> {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Раз уж перешли на работу с базой данных, то от этого репозитария можно избавиться.
На Ваше усмотрение.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Убрал совсем. Думал что будет 2 реализации или в памяти или чрез бд.

mpaRating.put(i, new Mpa());
mpaRating.get(i).setId(i);
}
mpaRating.get(1L).setName("G");
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нет, но в любом случае нужно брать данные непосредственно из справочника базы данных. А вдруг они изменились? Тогда придётся вносить изменения в код.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Убрал совсем. Думал что будет 2 реализации или в памяти или чрез бд. для БД использовал MpaDbStorage в нём запрашиваются из справочника бд

return returnAll;
return returnAll.stream()
.peek(film -> {
film.setGenres(filmStorage.getGenre(film.getId()));
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь та же история-запросы в цикле. Нужно постараться избавиться..Сократить количество запросов.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Часть смог подправить а часть не хватило мозгов. Но я всё размышляю и пытаюсь решить. Не могу понять как массив из жанров или лайков добавить в один запрос когда из sql собирается класс film

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

  public Collection<Film> getFilms() {
        String sql = """
            SELECT * FROM films
            LEFT OUTER JOIN mpa ON films.mpa_id = mpa.mpa_id""";
        Collection<Film> films = jdbc.query(sql, filmRowMapper);
        connectGenres(films);
  ......................

    private void connectGenres(Collection<Film> films) {
        String selectGenresSQL = """
               SELECT * FROM film_genre AS fg
               LEFT JOIN genres ON fg.genre_id = genres.genre_id
               WHERE film_id IN (:film_ids)""";
        List<Integer> filmIds = films.stream().map(Film::getId).toList();
        MapSqlParameterSource params = new MapSqlParameterSource("film_ids", filmIds);
        SqlRowSet rs = jdbc.queryForRowSet(selectGenresSQL, params);

        Map<Integer, Film> filmsMap = films.stream()
                .collect(Collectors.toMap(Film::getId, film -> film));

        while (rs.next()) {
................................

Попытайтесь, пожалуйста, реализовать. Не будет получаться, ничего страшного, подберём другой вариант. )

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Спасибо. примерно понял как сделать. Сделал, выложил обновленную версию.

@@ -8,13 +8,12 @@
@Repository
public class InMemoryUserStorage extends Storage<User> implements UserStorage<User> {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Действительно ли нужны эти классы? По-моему, они остались от предыдущей версии проекта, где ещё не было работы с базой данных. Если так, то лучше совсем удалить их, они больше не нужны

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Убрал совсем. Думал что будет 2 реализации или в памяти или чрез бд.

Copy link
Copy Markdown

@avfyodorov avfyodorov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Добрый вечер, Константин!

Отметил момент, который можно было бы поправить, но, думаю, что Вы справитесь и вне ревью. 🙂
Работа принята.
Оставил комментарий.

@LevshaKS LevshaKS merged commit 81d0d5a into main Jun 7, 2025
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants