我目前正在为我的项目使用myBatis,它对复杂的SQL很好,但我发现我需要为基本的CRUD创建许多冗余的SQL。所以我遇到了spring-data-jdbc (here),它是一个非常好的库(类似于spring-data-jpa,但没有JPA持久性),可以帮助通过方法名生成CRUD SQL语句。
他们官方网站上关于如何与myBatis集成的指南非常模糊,我找不到任何其他来源来说明如何做到这一点。基本上,我正在寻找一种方法,如下所示:
@Repository
@Mapper
public interface PersonRepository extends CrudRepository<Person, Long> {
//via spring-data-jdbc
List<Person> findAll();
//via spring-data-jdbc
List<Person> findByFirstName(String name);
//via myBatis, the actual query is in PersonMapper.xml
List<Person> selectAllRow();
}正如您所看到的,当我调用findAll和findByFirstName时,它们将由spring-data-jdbc处理。当我调用selectAllRow时,它将查找对应的myBatis映射器文件以获取实际的SQL。通过这种方式,我可以将两种机制组合在一起来处理简单CRUD查询和复杂查询(通过myBatis)。
但是上面的不起作用,所以目前我不得不将它们分成两个界面,一个用于PersonRepository,另一个用于PersonMapper,这不是一个很好的设计。
以前有没有人做过类似的事情?
发布于 2021-05-21 18:41:53
有两个独立的接口,一个用于存储库,另一个用于mybatis映射器,这就是spring-data-jdbc中mybatis集成的工作方式(2.2.1版)。
Mapper只是spring数据存储库的一个实现细节,不应该被客户端使用,所以它不应该是一个问题。
你想要的东西可能是可以做到的,但需要相当多的工作,而且可能不值得。
@Repository注解指示spring-data-jdbc创建一个实现PersonRepository的代理,其中包含将对象提取到数据库或将对象保存到数据库的所有机制。
另一方面,@Mapper指示mybatis-spring创建另一个代理,该代理将处理来自xml中提供的映射的查询,或者通过接口方法上的注释处理查询。
只有一个代理可以被注入到你要使用PersonRepository的地方。您可以做的是为PersonRepository创建自己的代理,它将创建spring-data-jdbc和mybatis代理,并将调用分派给它们。但是与委托给两个独立的PersonRepository和PersonMapper的简单类相比,这个解决方案的复杂性会相当高。
更新:似乎有一种方法可以将mybatis映射器与存储库结合起来,如此评论https://github.com/spring-projects/spring-data-jdbc/pull/152#issuecomment-660151636中所述
这种方法使用repository fragments将mybatis片段添加到存储库实现中。
https://stackoverflow.com/questions/67634267
复制相似问题