将 JdbcTemplate 与 CrudRepository 混合使用有意义吗?

Jua*_*ano 5 java spring jdbc spring-data spring-data-jpa

我对 Spring 的对象(以及一般的 spring-jdbc)非常熟悉JdbcTemplate,并且我非常喜欢自己编写 SQL 并处理对象映射。

然而最近我在玩这个CrudRepository界面,我真的很喜欢它。

也就是说,当涉及到复杂的查询(连接等)时,我仍然倾向于编写自己的 SQL 查询。

我希望能够CrudRepository在也有实例的类中使用这些方法JdbcTemplate,这样我就可以拥有开箱即用的方法,CrudRepository同时能够编写自己的复杂 SQL 并将它们与JdbcTemplate.

当然,问题是,这CrudRepository只是一个接口,而它JdbcTemplate是一个常规类。所以问题是

  1. 我提到的任何内容实际上有意义吗?
  2. 假设(1)的答案是肯定的,那么我如何才能拥有一个带有 a 实例的类JdbcTemplate,并且还提供了 a 的实现,CrudRepository而不必过多地绕过它?

M. *_*num 3

在任何应用程序中混合使用 JPA 和 JDBC 是非常有可能的。可JdbcTemplate用于编写复杂的查询或进行更复杂的自定义映射。另一种选择是使用 a 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
}
Run Code Online (Sandbox Code Playgroud)

现在您可以同时使用两者。Spring 的好处是,无论使用CrudRepository或 ,JdbcTemplate它都会抛出相同的异常DataAccessException。如果它们在同一台上运行,DataSource则单个JpaTransactionManager就足以管理连接和事务。