【问题标题】:Does it make sense to mix JdbcTemplate with CrudRepository?将 JdbcTemplate 与 CrudRepository 混合是否有意义?
【发布时间】:2019-04-25 06:29:48
【问题描述】:

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

不过最近我在玩CrudRepository 界面,我真的很喜欢它。

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

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

当然,问题是CrudRepository 只是一个接口,而JdbcTemplate 是一个普通类。所以问题是

  1. 我所说的是否真的有意义?
  2. 假设 (1) 的答案是肯定的,我如何才能拥有一个带有 JdbcTemplate 实例的类,它还提供了 CrudRepository 的实现,而不必过多地破解它?

【问题讨论】:

    标签: java spring jdbc spring-data-jpa spring-data


    【解决方案1】:

    在任何应用程序中混合 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 足以管理连接和事务。

    【讨论】:

    • jdbcTemplate 是否知道实体管理器一级缓存和刷新策略?我会怀疑这一点。因此,这为不一致和意外行为打开了空间。您对此有更多经验吗?
    • 当然不是,所以在使用 jdbc 模板之前执行flush 是明智的(或者您可以使用一些 AOP 来自动执行此操作)。除非您确定所有内容都已被刷新。
    【解决方案2】:

    为什么不把他们当成会员呢?

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

    当然,您需要通过所有方法,这对嘈杂很友好。 Dao 将是刻板印象 Data Access Object。

    【讨论】:

    • 我想到了,但是我需要在MyDao 类中公开CrudRepository 的所有方法,它会变得复杂:(
    猜你喜欢
    • 2017-09-17
    • 2013-05-15
    • 2012-03-12
    • 1970-01-01
    • 2013-01-04
    • 2010-09-12
    • 1970-01-01
    • 2013-04-24
    • 2011-12-03
    相关资源
    最近更新 更多