zoukankan      html  css  js  c++  java
  • 使用Spring Data JPA的Spring Boot

    本文教你开始使用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 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.8
    19 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 spring:
     2   datasource:
     3     url: jdbc:mysql://localhost:33099/dogs
     4     password: <ENTER _ PASSWORD _ HERE >
     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 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 package com.amitph.spring.dogs.repo;
    2 import org.springframework.data.repository.CrudRepository;
    3 import org.springframework.stereotype.Repository;
    4 @Repository
    5 public interface DogsRepository extends CrudRepository<Dog, Long> {}

    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 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 @Component
    10 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<Dog> getDogs() {
    19         return (List<Dog>) repository.findAll();
    20     }
    21     public Dog getDogById(long id) {
    22         Optional<Dog> 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 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 @RestController
    15 @RequestMapping("/dogs")
    16 public class DogsController {
    17     @Autowired DogsService service;
    18     @GetMapping
    19     public List<Dog> getDogs() {
    20         return service.getDogs();
    21     }
    22     @PostMapping
    23     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架构思维导图,分享给同样正在认真学习的每位朋友~

  • 相关阅读:
    RTMP、RTSP/OVIF、GB/T28181视频流媒体服务器的视频传输方式有哪几种?
    RTSP/ONVIF互联网直播服务器录像回看接口调用时查询到超出指定时间段录像文件
    RTSP/onvif网络摄像头直播时网页流媒体视频服务器可以查看所有在线视频流吗?
    安防网络摄像头互联网直播录像设置永久储存却只能播放一半问题解决
    海康大华网络摄像头视频直播流媒体服务器视频广场显示暂无快照的问题解决
    国标GB28181摄像头直播视频流媒体服务器获取视频流失败问题分析
    安防网络摄像头互联网直播流媒体服务器EasyNVR云终端断电重启后无法登录问题解决
    视频管理平台连接EasyNVR在公网IP下通过域名访问报错“请求服务不存在或停止”问题的解决
    安防/互联网直播点播系统在特种车用车安全行车辅助中的应用
    目前视频监控领域高清化的关键技术有哪些?
  • 原文地址:https://www.cnblogs.com/youruike-/p/12253700.html
Copyright © 2011-2022 走看看