Имеет ли смысл смешивать JdbcTemplate с CrudRepository? - PullRequest
0 голосов
/ 25 апреля 2019

Я довольно хорошо знаком с объектом JdbcTemplate в Spring (и вообще с spring-jdbc), и мне действительно нравится писать SQL и самостоятельно разбираться с отображением объектов.

Однако недавно я былиграть с интерфейсом CrudRepository, и он мне очень понравился.

Тем не менее, я все еще предпочитаю писать свои собственные запросы SQL, когда речь идет о сложном запросе (соединения и т. д.).

Я хотел бы иметь возможность использовать методы CrudRepository в классе, который также имеет экземпляр JdbcTemplate, таким образом, я мог бы иметь готовые методы CrudRepository, в то же время имея возможностьнаписать свои собственные сложные SQL и использовать их с JdbcTemplate.

Проблема, конечно, в том, что CrudRepository - это просто интерфейс, а JdbcTemplate - обычный класс.Таким образом, вопрос состоит в том,

  1. Имеет ли смысл то, что я упоминаю, на самом деле?
  2. Если предположить, что ответ на (1) - да, как я смогу иметь класс сэкземпляр JdbcTemplate, который также обеспечивает реализацию CrudRepository без необходимости слишком много взламывать его?

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Смешивание JPA и JDBC очень хорошо возможно в любом приложении.JdbcTemplate может использоваться для написания сложных запросов или создания более сложных пользовательских сопоставлений.Другой вариант - использовать RowCallbackHandler (вместо RowMapper для прямой потоковой передачи чего-либо в файл или другой ресурс для сохранения памяти).

При использовании Spring Data вы можете использовать аннотацию @Query для написания пользовательских запросов в хранилище.Это может быть собственный запрос или JPQL.

Однако в Spring нет ничего, что мешало бы вам использовать оба в одном классе.Вы можете напрямую внедрить свой репозиторий в сервис, а также JdbcTemplate (или вы можете поместить его за другим фасадом, если хотите).

@Service
@Transactional
public class YourService {

    private final YourCrudRepository repo;
    private final JdbcTemplate jdbc;

    public YourService(YourCrudRepository repo, JdbcTemplate jdbc) {
        this.repo=repo;
        this.jdbc=jdbc;
    }

    // Your methods go down here
}

Теперь вы можете использовать оба.Хорошая особенность Spring заключается в том, что независимо от использования CrudRepository или JdbcTemplate он выдаст те же исключения, DataAccessException.Если они работают на одном и том же DataSource, то одного JpaTransactionManager достаточно для управления соединением и транзакцией.

0 голосов
/ 25 апреля 2019

Почему бы просто не использовать их в качестве членов?

public class MyDao {
    private JdbcTemplate template;
    private CrudRepository repository;
}

Конечно, вам нужно пройти через все методы, что очень мило с шумом. Dao будет стереотипом D ata A ccess O bject.

...