本文教你开始使用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文件:

 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')
}

数据源配置

现在,我们已经配置了依赖项。现在还不该告诉要连接到哪个数据源。这是我的带有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和数据源创建数据库结构。

Entity Bean

我们将要做的第一级代码是编写一个Entity Bean。这是Oracle文档关于实体Bean的内容。

使用JPA,你可以将任何POJO类指定为JPA实体——使用从JPA持久性提供程序(在Java EE EJB容器内或外部)获得的实体管理器的服务,其非瞬态字段应持久保存到关系数据库的Java对象。Java SE应用程序中的EJB容器)。

用简单的话来说,JPA实体是任何Java POJO,都可以表示基础表结构。由于我们的服务基于“Dog”表,因此我们将创建一个“Dog” 实体对象。

 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的实体对象。

然后,有三个字段代表数据表列。字段ID是我们的主键,因此被标记为@Id。

字段ID也用@GeneratedValue标记,表示这是一个自动增量列,Hibernate将负责输入下一个值。Hibernate首先将查询基础表以了解该列的最大值,并在下一次插入时对其进行递增。这也意味着我们不需要为Id列指定任何值,可以将其留空。

仓库接口

存储库代表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层。现在,让我们编写一个简单的服务层和一个控制器。

控制器和服务层

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

Dogs Service

此类具有简单的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;
}
}

Dogs控制器

Dogs Controller是具有简单CRUD端点的标准REST控制器。控制器的工作是处理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端点。

结论

Spring数据和JPA教程的Spring Boot到此结束。我们看到了如何将Spring Data的抽象用于数据访问层。我们看到了如何以Entity Bean的形式表示数据库表,以及如何使用Spring Data的自动生成的存储库实现。此外,我们还看到了如何使用Spring Boot进行自动数据源配置。

在Spring Boot Rest Service帖子中,我们已经看到了使用Spring Boot创建RESTful Web服务。在当前文章中,我们不关心异常处理。访问Spring Rest Service异常处理以了解有关处理异常的信息。我们还跳过了这里的单元测试部分,这将在以后的文章中介绍。

感谢阅读!

另外近期整理了一套完整的java架构思维导图,分享给同样正在认真学习的每位朋友~

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

  1. Spring Data JPA 整合Spring

    1.1   Spring Data JPA 与 JPA和hibernate之间的关系 JPA是一套规范,内部是有接口和抽象类组成的.hibernate是一套成熟的ORM框架,而且Hibernate实现 ...

  2. Spring Data JPA简介 Spring Data JPA特点

    Spring Data JPA 是Spring基于ORM框架.JPA规范的基础上封装的一套JPA 应用框架,底层使用了Hibernate 的JPA技术实现,可使开发者用极简的代码即可实现对数据的访问和 ...

  3. Spring Data JPA在Spring Boot中的应用

    1.JPA JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.他的出现主要是为了简 ...

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

    之前我们学习了如何使用Jpa访问关系型数据库.比较完整Spring MVC和JPA教程请见Spring Data JPA实战入门,Spring MVC实战入门. 通过Jpa大大简化了我们对数据库的开发 ...

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

    https://www.tianmaying.com/tutorial/spring-jpa-page-sort Spring Data Jpa对于分页以及排序的查询也有着完美的支持,接下来,我们来学 ...

  6. <Spring Data JPA>二 Spring Data Jpa

    1.pom依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  7. Spring Data JPA 整合Spring 第二篇

    主要是在CustomerDao中去写一些代码,在调用Query中去用SQL 例如 public interface CustomerDao extends JpaRepository<Custo ...

  8. spring data jpa和spring data redis同时配置时,出现Multiple Spring Data modules found, entering strict repository configuration mode错误

    问题说明 data jpa和data redis同时配置时,出现Spring modules spring Spring Data Release Train <dependencyManage ...

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

    示例代码: /** * 如果barCode字段值为null则不处理 * 如果barCode字段值不为null则在原本值的前面拼接 del: * @param dealer * @return */ @ ...

随机推荐

  1. 算法-leetcode-65-Valid Number

    算法-leetcode-65-Valid Number 上代码: # coding:utf-8 __author__ = "sn" """Valida ...

  2. python3升级pip报错ImportError: cannot import name 'main'

    把系统的python版本从默认的2切换到3后,使用pip3安装依赖报错,如下: Traceback (most recent call last): File , in <module> ...

  3. ZeroTier 局域网组建工具

    无公网IP通过ZeroTier实现内网穿透 需求:想要在公司访问家里内网NAS,或是在家里访问公司服务 有固定的公网IP或动态的公网IP:常见的方案动态域名解析做端口转发方式等 无公网IP:常见的实现 ...

  4. LeetCode 680. Valid Palindrome II(双指针)

    题意:给定一个字符串,可以最多去掉一个字符,判断是否可以使该字符串成为一个回文串. 分析:head和tail双指针分别指向字符串首尾,如果s[head] != s[tail],则要么去掉s[head] ...

  5. 关于hrf图的做法

    要拿matlab 的spm 包功能做 Model specification ,review and estimation specify1st level 第二张图是在建模以后,通过spm中的res ...

  6. Linux centosVMware Linux监控平台介绍、zabbix监控介绍、安装zabbix、忘记Admin密码如何做

    一.Linux监控平台介绍 cacti.nagios.zabbix.smokeping.open-falcon等等 cacti.smokeping偏向于基础监控,成图非常漂亮 cacti.nagios ...

  7. Python 之并发编程之进程下(事件(Event())、队列(Queue)、生产者与消费者模型、JoinableQueue)

    八:事件(Event()) # 阻塞事件:    e = Event() 生成事件对象e    e.wait() 动态给程序加阻塞,程序当中是否加阻塞完全取决于该对象中的is_set() [默认返回值 ...

  8. ecshop代码分析一(init.php文件)

    ecshop代码分析一(init.php文件)   因为工作原因,需要对ecshop二次开发,顺便记录一下对ecshop源代码的一些分析: 首先是init.php文件,这个文件在ecshop每个页面都 ...

  9. 获取SDWebImage的缓存大小并清除

    // 获取SDWebImage的缓存大小 - (NSString *)cacheSizeFormat { NSString *sizeUnitString; float size = [SDWebIm ...

  10. Keras入门——(2)卷积神经网络CNN

    前期准备工作参考:https://www.cnblogs.com/ratels/p/11144881.html 基于CNN算法利用Keras框架编写代码实现对Minst数据分类识别: from ker ...