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

时间:2019-04-25 06:29:48

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

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

但是最近我正在使用CrudRepository界面,我真的很喜欢它。

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

我希望能够在也有CrudRepository实例的类中使用JdbcTemplate方法,这样我就可以使用CrudRepository的现成方法能够编写自己的复杂SQL并将其与JdbcTemplate一起使用。

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

  1. 我要说的话真的有意义吗?
  2. 假设对(1)的回答是肯定的,那么我将如何能够拥有一个带有JdbcTemplate实例的类,而该实例也提供CrudRepository的实现,而不必费解太多了吗?

2 个答案:

答案 0 :(得分: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就足以管理连接和事务。

答案 1 :(得分:0)

为什么不只是将它们用作成员?

grid.getEditorFieldGroup().addCommitHandler(new FieldGroup.CommitHandler() {

    @Override
    public void preCommit(FieldGroup.CommitEvent commitEvent) throws
    FieldGroup.CommitException {
        BeanItem item = (BeanItem)
        commitEvent.getFieldBinder().getItemDataSource();
        MyClass qm = (MyClass) item.getBean();
        grid.getColumn("myColumn").
        setEditorField(generateMachineCode(qm.myColumnValue());
    }

    private Field << ? > generateMachineCode(String machineCode) {
        TextField editableTextFiled = new TextField();
        editableTextFiled.setEnabled(true);

        if (StringUtils.isNotEmpty(machineCode) && !machineCode.equals("12345")) {
            editableTextFiled.addValidator(new StringLengthValidator("It must be 6 
                    characters ", 6, 6, false));
        }
    }
}

当然,您将需要通过所有方法,这很嘈杂。 public class MyDao { private JdbcTemplate template; private CrudRepository repository; } 将是原型 D ata A 事件 O 对象。