首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring-data-jdbc与mybatis集成

spring-data-jdbc与mybatis集成
EN

Stack Overflow用户
提问于 2021-05-21 17:32:51
回答 1查看 316关注 0票数 2

我目前正在为我的项目使用myBatis,它对复杂的SQL很好,但我发现我需要为基本的CRUD创建许多冗余的SQL。所以我遇到了spring-data-jdbc (here),它是一个非常好的库(类似于spring-data-jpa,但没有JPA持久性),可以帮助通过方法名生成CRUD SQL语句。

他们官方网站上关于如何与myBatis集成的指南非常模糊,我找不到任何其他来源来说明如何做到这一点。基本上,我正在寻找一种方法,如下所示:

代码语言:javascript
复制
@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();
}

正如您所看到的,当我调用findAllfindByFirstName时,它们将由spring-data-jdbc处理。当我调用selectAllRow时,它将查找对应的myBatis映射器文件以获取实际的SQL。通过这种方式,我可以将两种机制组合在一起来处理简单CRUD查询和复杂查询(通过myBatis)。

但是上面的不起作用,所以目前我不得不将它们分成两个界面,一个用于PersonRepository,另一个用于PersonMapper,这不是一个很好的设计。

以前有没有人做过类似的事情?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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代理,并将调用分派给它们。但是与委托给两个独立的PersonRepositoryPersonMapper的简单类相比,这个解决方案的复杂性会相当高。

更新:似乎有一种方法可以将mybatis映射器与存储库结合起来,如此评论https://github.com/spring-projects/spring-data-jdbc/pull/152#issuecomment-660151636中所述

这种方法使用repository fragments将mybatis片段添加到存储库实现中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67634267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档