查看: 179|回复: 0

使用Spring Data JPA的Spring Boot

[复制链接]
发表于 2020-2-3 00:58:15 | 显示全部楼层 |阅读模式
本文教你开始使用Spring Data JPA。来自优锐课JAVA架构专业讲师经心整理
接待使用带有Spring Data JPA的Spring Boot教程!在本教程中,我们将看到Spring Data JPA如安在DAO层上提供完整的抽象。我们不再必要为DAO层编写实现; Spring Data自动天生实现DAO实现。
我们已经对Spring Boot进行了介绍,在本教程中,我们将结合使用Spring Boot和Spring Data。你还将看到Spring Boot自动配置如何资助你轻松完成数据源配置。
在我们的Spring Boot Rest Service教程中,我们创建了一个DogService,其中包括一个基于Mock Data Provider的简单CRUD服务。我们将使用相同的DogService,并使用现实的MySQL数据库以及Spring Data和JPA更换Mock Data Provider。
依赖配置

在本教程中,我将MySQL数据库与Spring Data一起使用。 这是build.gradle文件:
  1. 1 buildscript { 2     ext { 3         springBootVersion = '2.1.0.RELEASE' 4     } 5     repositories { 6         mavenCentral() 7     } 8     dependencies { 9         classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")10     }11 }12 apply plugin: 'java'13 apply plugin: 'eclipse'14 apply plugin: 'org.springframework.boot'15 apply plugin: 'io.spring.dependency-management'16 group = 'com.amitph.spring'17 version = '0.0.1-SNAPSHOT'18 sourceCompatibility = 1.819 repositories {20     mavenCentral()21 }22 dependencies {23     implementation('org.springframework.boot:spring-boot-starter-web')24     compile("org.springframework.boot:spring-boot-starter-data-jpa")25     compile('mysql:mysql-connector-java:8.0.13')26     testImplementation('org.springframework.boot:spring-boot-starter-test')27 }
复制代码


数据源配置

现在,我们已经配置了依赖项。现在还不该告诉要毗连到哪个数据源。这是我的带有Spring Boot数据源条目的application.yml。
  1. 1 spring: 2   datasource: 3     url: jdbc:mysql://localhost:33099/dogs 4     password:  5     username: root 6     driver-class-name: "com.mysql.jdbc.Driver" 7   jpa: 8     database-platform: org.hibernate.dialect.MySQL5InnoDBDialect 9     hibernate:10       ddl-auto: update
复制代码

在这里,我们具有指定的JDBC URL,用户名,密码驱动程序类名称(MySQL)。
除此之外,另有JPA特定的配置。起首是数据库平台,它告诉我们在MySQL查询方言下要思量的底子Hibernate功能。如许,全部数据库操作将以MySQL特定的语法处置惩罚。第二个JPA配置是ddl-auto,它告诉Hibernate创建各自的数据库和表结构(如果尚未存在的话)。
启用此选项后,Hibernate将基于实体Bean和数据源创建数据库结构。
Entity Bean

我们将要做的第一级代码是编写一个Entity Bean。这是Oracle文档关于实体Bean的内容。
使用JPA,你可以将任何POJO类指定为JPA实体——使用从JPA持久性提供程序(在Java EE EJB容器内或外部)获得的实体管理器的服务,其非瞬态字段应持久保存到关系数据库的Java对象。Java SE应用程序中的EJB容器)。

用简单的话来说,JPA实体是任何Java POJO,都可以表示底子表结构。由于我们的服务基于“Dog”表,因此我们将创建一个“Dog” 实体对象。
  1. 1 package com.amitph.spring.dogs.repo; 2 import javax.persistence.Entity; 3 import javax.persistence.GeneratedValue; 4 import javax.persistence.Id; 5 @Entity 6 public class Dog { 7     @Id 8     @GeneratedValue 9     private long id;10     private String name;11     private int age;12     public long getId() {13         return id;14     }15     public void setId(long id) {16         this.id = id;17     }18     public String getName() {19         return name;20     }21     public void setName(String name) {22         this.name = name;23     }24     public int getAge() {25         return age;26     }27     public void setAge(int age) {28         this.age = age;29     }30 }
复制代码

上面的POJO用@Entity解释,表示这是表名Dog的实体对象。
然后,有三个字段代表数据表列。字段ID是我们的主键,因此被标志为@Id。
字段ID也用@GeneratedValue标志,表示这是一个自动增量列,Hibernate将负责输入下一个值。Hibernate起首将查询底子表以了解该列的最大值,并在下一次插入时对其进行递增。这也意味着我们不必要为Id列指定任何值,可以将其留空。

堆栈接口

存储库代表DAO层,通常执行全部数据库操作。感谢Spring Data,他提供了这些方法的实现。让我们看看我们的DogsRepoisitory,它扩展了CrudRepository:
  1. 1 package com.amitph.spring.dogs.repo;2 import org.springframework.data.repository.CrudRepository;3 import org.springframework.stereotype.Repository;4 @Repository5 public interface DogsRepository extends CrudRepository {}
复制代码

DogsRepository中这里没有方法声明。这是因为Spring Data的CrudInterface 已经声明了基本的CRUD方法。
在这里,我们完成了JPA和Spring数据工作——换句话说,就是DAO层。现在,让我们编写一个简单的服务层和一个控制器

控制器和服务层

完成数据访问层后,我们将编写控制器和服务层。请留意,DogsRepository带有@Repository解释,这也将其添加到Spring Context中。现在,我们可以在Service中自动连线存储库。
Dogs Service

此类具有简单的CRUD方法。还将Entity Bean转换为DTO(数据传输对象)。DTO还是一个简单的Java POJO,用于在系统之间传输数据。在这里,我们从REST端点返回DTO。
  1. 1 package com.amitph.spring.dogs.service; 2 import com.amitph.spring.dogs.model.DogDto; 3 import com.amitph.spring.dogs.repo.Dog; 4 import com.amitph.spring.dogs.repo.DogsRepository; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.stereotype.Component; 7 import java.util.List; 8 import java.util.Optional; 9 @Component10 public class DogsService {11     @Autowired DogsRepository repository;12     public void add(DogDto dto) {13         repository.save(toEntity(dto));14     }15     public void delete(long id) {16         repository.deleteById(id);17     }18     public List getDogs() {19         return (List) repository.findAll();20     }21     public Dog getDogById(long id) {22         Optional optionalDog = repository.findById(id);23         return optionalDog.orElseThrow(() -> new DogNotFoundException("Couldn't find a Dog with id: " + id));24     }25     private Dog toEntity(DogDto dto) {26         Dog entity = new Dog();27         entity.setName(dto.getName());28         entity.setAge(dto.getAge());29         return entity;30     }31 }
复制代码


Dogs控制器

Dogs Controller是具有简单CRUD端点的标准REST控制器。控制器的工作是处置惩罚HTTP请求并调用Service类方法。
  1. 1 package com.amitph.spring.dogs.web; 2 import com.amitph.spring.dogs.model.DogDto; 3 import com.amitph.spring.dogs.repo.Dog; 4 import com.amitph.spring.dogs.service.DogsService; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.web.bind.annotation.DeleteMapping; 7 import org.springframework.web.bind.annotation.GetMapping; 8 import org.springframework.web.bind.annotation.PathVariable; 9 import org.springframework.web.bind.annotation.PostMapping;10 import org.springframework.web.bind.annotation.RequestBody;11 import org.springframework.web.bind.annotation.RequestMapping;12 import org.springframework.web.bind.annotation.RestController;13 import java.util.List;14 @RestController15 @RequestMapping("/dogs")16 public class DogsController {17     @Autowired DogsService service;18     @GetMapping19     public List getDogs() {20         return service.getDogs();21     }22     @PostMapping23     public void postDogs(@RequestBody DogDto dto) {24         service.add(dto);25     }26     @GetMapping("/{id}")27     public Dog getById(@PathVariable(required = true) long id) {28         return service.getDogById(id);29     }30     @DeleteMapping("/{id}")31     public void delete(@PathVariable(required = true) long id) {32         service.delete(id);33     }34 }
复制代码

现在,Dogs Service已准备好运行。启动应用程序并执行HTTP端点。

结论

Spring数据和JPA教程的Spring Boot到此结束。我们看到了如何将Spring Data的抽象用于数据访问层。我们看到了如何以Entity Bean的形式表示数据库表,以及如何使用Spring Data的自动天生的存储库实现。此外,我们还看到了如何使用Spring Boot进行自动数据源配置。
在Spring Boot Rest Service帖子中,我们已经看到了使用Spring Boot创建RESTful Web服务。在当前文章中,我们不关心非常处置惩罚。访问Spring Rest Service非常处置惩罚以了解有关处置惩罚非常的信息。我们还跳过了这里的单元测试部分,这将在以后的文章中介绍。
感谢阅读!
另外近期整理了一套完整的java架构思维导图,分享给同样正在认真学习的每位朋友~

相关技术服务需求,请联系管理员和客服QQ:2753533861或QQ:619920289
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

帖子推荐:
客服咨询

QQ:2753533861

服务时间 9:00-22:00

快速回复 返回顶部 返回列表