使用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架构思维导图,分享给同样正在认真学习的每位朋友~

原文地址:https://www.cnblogs.com/youruike-/p/12253700.html

时间: 2024-08-29 15:29:05

使用Spring Data JPA的Spring Boot的相关文章

Spring Data JPA 整合Spring

1.1   Spring Data JPA 与 JPA和hibernate之间的关系 JPA是一套规范,内部是有接口和抽象类组成的.hibernate是一套成熟的ORM框架,而且Hibernate实现了JPA规范,所以也可以称hibernate为JPA的一种实现方式,我们使用JPA的API编程,意味着站在更高的角度上看待问题(面向接口编程) Spring Data JPA是Spring提供的一套对JPA操作更加高级的封装,是在JPA规范下的专门用来进行数据持久化的解决方案. (1).主要说的是C

Spring Data JPA在Spring Boot中的应用

1.JPA JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate,TopLink,JDO等ORM框架各自为营的局面.值得注意的是,JPA是在充分吸收了现有Hibernate,TopLink,JDO等ORM框架的基础上发展而来的,具有易于使用,伸缩性强等优点.JPA是一套规范,不是一套产品,那么像H

整合Spring Data JPA与Spring MVC: 分页和排序

之前我们学习了如何使用Jpa访问关系型数据库.比较完整Spring MVC和JPA教程请见Spring Data JPA实战入门,Spring MVC实战入门. 通过Jpa大大简化了我们对数据库的开发工作.但是,之前的例子中我们只提到了最简单的CRUD(增删改查)操作.实际上,Spring Data Jpa对于分页以及排序的查询也有着完美的支持,接下来,我们来学习如何通过Pageable来对数据库进行分页查询. 添加maven依赖 首先我们需要引入Jpa,数据库直接使用hsqldb内存数据库就可

&lt;Spring Data JPA&gt;二 Spring Data Jpa

1.pom依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4

【spring data jpa】spring data jpa 中的update 更新字段,如果原字段值为null不处理,不为null则在原来的值上加一段字符串

示例代码: /** * 如果barCode字段值为null则不处理 * 如果barCode字段值不为null则在原本值的前面拼接 del: * @param dealer * @return */ @Modifying @Transactional @Query("update Dealer d set " + " d.deleteFlag = 1 ," + " d.barCode = CASE WHEN d.barCode IS NULL THEN d.

Spring Data JPA例子[基于Spring Boot、Mysql]

关于Spring Data Spring社区的一个顶级工程,主要用于简化数据(关系型&非关系型)访问,如果我们使用Spring Data来开发程序的话,那么可以省去很多低级别的数据访问操作,如编写数据查询语句.DAO类等,我们仅需要编写一些抽象接口并定义相关操作即可,Spring会在运行期间的时候创建代理实例来实现我们接口中定义的操作. 关于Spring Data子项目 Spring Data拥有很多子项目,除了Spring Data Jpa外,还有如下子项目. Spring Data Comm

Spring Boot教程35——Spring Data JPA

Hibernate是数据访问解决技术的绝对霸主.JPA是由Hibernate主导的一个基于O/R映射的标准规范.O/R映射即将领域模型类和数据库的表进行映射,通过程序操作对象而实现表数据操作的能力,让数据访问操作无须关注数据库相关的技术. Spring Data JPA介绍 1.定义数据访问层 使用Spring Data JPA建立数据访问层十分简单,只需定义一个继承JpaRepository的接口即可: public interface PersonRepository extends Jpa

Spring Boot 2.0.4整合Spring Data JPA和Druid,双数据源

最近Team开始尝试使用Spring Boot + Spring Data JPA作为数据层的解决方案,在网上逛了几圈之后发现大家并不待见JPA,理由是(1)MyBatis简单直观够用,(2)以Hibernate为底层的Spring Data JPA复杂且性能一般. 但是当我们来到Spring Boot的世界后发现,相较于Spring Data JPA,MyBatis对Spring Boot的支持有限,Spring Data JPA与Spring Boot结合可以让dao变得非常简单,比如(1)

Spring Boot:整合Spring Data JPA

综合概述 JPA是Java Persistence API的简称,是一套Sun官方提出的Java持久化规范.其设计目标主要是为了简化现有的持久化开发工作和整合ORM技术,它为Java开发人员提供了一种ORM工具来管理Java应用中的关系数据. 简而言之,JPA提供了使用面向对象的方式操作数据库的功能.JPA充分吸收了现有Hibernate,TopLink,JDO等ORM框架的优势,具有易于使用.伸缩性强等优点. Spring Data JPA是Spring基于Spring Data框架对于JPA