首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java接口- CrudRepository

Java接口- CrudRepository
EN

Stack Overflow用户
提问于 2017-12-21 19:06:57
回答 2查看 208关注 0票数 1

我试图真正理解Java中的这些接口是如何工作的。据我所知,它在某种程度上是用来描述实现类将做什么,但不是如何实现的。这对我来说已经足够清楚了。

问题是,当我尝试使用Spring Data package中的CrudRepository接口时,我真的不知道它是如何工作的。例如,我创建了CarRepository,它在不添加任何新方法的情况下扩展CrudRepository接口。在此之后,我创建了CarService类,它通过CarService构造函数注入CarRepository以进行依赖注入。

关于这一点,我使用了来自CarRepositorysave方法,我完全迷惑了,因为我不知道,它怎么可能真的将传递的对象保存到数据库中。原因是,这个save方法没有'body',那么它怎么知道,如何插入到数据库中呢?

代码示例如下:

代码语言:javascript
复制
class CarService{
     private CarRepository carRepository;
     public CarService(CarRepository carRepository){
           this.carRepository = carRepository;}

     public Car saveCar(Car car){
     Car savedCar = carRepository.save(car);
     return savedCar;

}


}
}

你们能不能给我解释一下,这个方法怎么可能把car对象保存到任何配置到spring的数据库中?因为没有save方法体,所以它怎么知道该怎么做呢?

EN

回答 2

Stack Overflow用户

发布于 2017-12-21 19:19:59

它是Spring Data提供的功能。在幕后,Spring将决定您要使用的数据库。假设您正在使用SQL数据库PostgreSQL。Spring确定它应该使用适当的接口JpaRepository。然后Spring Data JPA,众多Spring Data子模块之一,将为JpaRepository提供基本实现。

Spring还能够动态地为您在CarRepository中声明的任何自定义查询提供实现。但是,要使其正常工作,声明的方法需要遵循特定的命名约定。例如,Spring能够理解该方法

代码语言:javascript
复制
List<Car> findByName(String name);

它将通过参数name检索所有的Car,但不是

代码语言:javascript
复制
List<Car> pleaseGiveAllCarsWithName(String name);

有关方法命名约定,请参阅documentation

正是由于Spring提供的这些实现,基本方法(如save )以及自定义查询(如findByName )将“开箱即用”。

票数 3
EN

Stack Overflow用户

发布于 2017-12-21 19:27:34

通常,为了能够在Java应用程序中使用接口,您还需要至少一个实现该接口的非抽象类-否则在调用方法时实际上没有什么可执行的。

Spring Data使用接口的方式与您在“普通”Java程序中使用接口的方式不同。它会查看您的存储库接口,然后在您运行程序时自动生成一个实现该接口的类。当您在存储库接口上调用方法时,实际执行的是自动生成的类中的代码。

你永远看不到实际的类,因为当你运行程序时,它是动态生成的--当你编写和编译代码时,它还不存在。

这种工作方式非常强大,这也是Spring Data如此易于使用的原因。您不必自己编写使用数据库的所有繁琐代码-您只需定义一个接口,该接口指定您想要从数据库中获取的确切内容,Spring Data将自动为您生成所有代码。

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

https://stackoverflow.com/questions/47923614

复制
相关文章

相似问题

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