译:Spring Boot 与 Spring Data JPA | Spring For All

308 阅读5分钟
原文链接: www.spring4all.com

Spring Boot 与 Spring Data JPA

原文链接:dzone.com/articles/sp…

作者:Amit Phaltankar

译者:Yunooa

欢迎使用Spring Boot中的Spring Data JPA教程!在本教程中,我们将了解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,将Mock Data Provider与Spring Data和JPA一起替换为实际的MySQL数据库。

1.依赖配置

在本教程中,我将使用MySQL数据库和 Spring Data。这是 build.gradle 文件:

buildscript {
    ext {
        springBootVersion = '2.1.0.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.amitph.spring'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
    mavenCentral()
}
dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web')
    compile("org.springframework.boot:spring-boot-starter-data-jpa")
    compile('mysql:mysql-connector-java:8.0.13')
    testImplementation('org.springframework.boot:spring-boot-starter-test')
}

在此处了解有关JPA和Spring Data JPA的更多信息:

2.数据源配置

我们现在配置了依赖项。现在是告诉连接哪个数据源的时候了。这是我带有Spring Boot数据源条目的application.yml。

spring:
  datasource:
    url: jdbc:mysql://localhost:33099/dogs
    password: <ENTER _ PASSWORD _ HERE >
    username: root
    driver-class-name: "com.mysql.jdbc.Driver"
  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    hibernate:
      ddl-auto: update

在这里,我们有指定的JDBC URL,用户名,密码和驱动程序类名(MySQL)。
除此之外,还有JPA特定配置。首先是数据库平台,它告诉我们在MySQL查询方言下要考虑的基础Hibernate功能。这样所有数据库操作都将以MySQL特定语法处理。第二个JPA配置是ddl-auto,它告诉Hibernate创建相应的数据库和表结构(如果尚未存在)。
启用此选项后,Hibernate将基于实体Bean和数据源创建数据库结构。

3.实体Bean

我们要做的第一个代码级别的事情就是编写一个实体Bean。以下是Oracle文档中有关Entity Beans的内容。
file简单来说,JPA实体是任何Java POJO,它可以表示基础表结构。由于我们的服务基于Dog 表,我们将创建一个 Dog Entity对象。

package com.amitph.spring.dogs.repo;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Dog {
    @Id
    @GeneratedValue
    private long id;
    private String name;
    private int age;
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

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

4.存储库接口

Repository表示DAO层,它通常执行所有数据库操作。感谢Spring Data,他提供了这些方法的实现。让我们来看看我们 DogsRepoisitory,它扩展了 CrudRepository:

package com.amitph.spring.dogs.repo;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface DogsRepository extends CrudRepository<Dog, Long> {}

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

5.控制器和服务层

当我们完成数据访问层时,我们将编写控制器和服务层。请注意,它DogsRepository 带有注释@Repository,它也将它添加到Spring Context中。我们现在可以Autowire在存储库中了Service。

6.Dog服务

这个类有简单的CRUD方法。它还将Entity bean转换为DTO(数据传输对象)。DTO也是一个简单的Java POJO,用于在系统之间传输数据。在这里,我们从REST端点返回DTO。

package com.amitph.spring.dogs.service;
import com.amitph.spring.dogs.model.DogDto;
import com.amitph.spring.dogs.repo.Dog;
import com.amitph.spring.dogs.repo.DogsRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Optional;
@Component
public class DogsService {
    @Autowired DogsRepository repository;
    public void add(DogDto dto) {
        repository.save(toEntity(dto));
    }
    public void delete(long id) {
        repository.deleteById(id);
    }
    public List<Dog> getDogs() {
        return (List<Dog>) repository.findAll();
    }
    public Dog getDogById(long id) {
        Optional<Dog> optionalDog = repository.findById(id);
        return optionalDog.orElseThrow(() -> new DogNotFoundException("Couldn't find a Dog with id: " + id));
    }
    private Dog toEntity(DogDto dto) {
        Dog entity = new Dog();
        entity.setName(dto.getName());
        entity.setAge(dto.getAge());
        return entity;
    }
}

7.Dog控制器

Dogs Controller是一个标准的REST控制器,具有简单的CRUD端点。控制器的工作是处理HTTP请求并调用Service类方法。


package com.amitph.spring.dogs.web;
import com.amitph.spring.dogs.model.DogDto;
import com.amitph.spring.dogs.repo.Dog;
import com.amitph.spring.dogs.service.DogsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/dogs")
public class DogsController {
    @Autowired DogsService service;
    @GetMapping
    public List<Dog> getDogs() {
        return service.getDogs();
    }
    @PostMapping
    public void postDogs(@RequestBody DogDto dto) {
        service.add(dto);
    }
    @GetMapping("/{id}")
    public Dog getById(@PathVariable(required = true) long id) {
        return service.getDogById(id);
    }
    @DeleteMapping("/{id}")
    public void delete(@PathVariable(required = true) long id) {
        service.delete(id);
    }
}

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

8.结论

这是我们使用Spring数据和JPA教程的Spring Boot的结束。我们看到了如何将Spring Data的抽象用于数据访问层。我们看到了如何以Entity Bean的形式表示数据库表以及如何使用Spring Data的自动生成的存储库实现。此外,我们还了解了如何使用Spring Boot进行自动数据源配置。
在Spring Boot Rest Service帖子中,我们已经看到使用Spring Boot创建RESTful Web服务。在本文中,我们并不关心异常处理。访问Spring Rest服务异常处理以了解处理异常。我们也跳过了这里的单元测试部分,将在后续文章中介绍。

有关此处使用的完整源代码和示例,请访问github.com/amitrp/dog-…

关注社区公号,加入社区纯技术微信群