SpringBoot 实战 (八) | 使用 Spring Data JPA 访问 Mysql 数据库

本文主要是介绍SpringBoot 实战 (八) | 使用 Spring Data JPA 访问 Mysql 数据库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

微信公众号:一个优秀的废人
如有问题或建议,请后台留言,我会尽力解决你的问题。

前言

如题,今天介绍 Spring Data JPA 的使用。

什么是 Spring Data JPA

在介绍 Spring Data JPA 之前,首先介绍 Hibernate 。 Hibernate 使用 O/R 映射 (Object-Relation Mapping) 技术实现数据访问, O/R 映射即将领域模型类与数据库的表进行映射,通过程序操作对象而实现表数据操作的能力,让数据访问操作无需关注数据库相关技术。

Hibernate 主导了 EJB 3.0 的 JPA 规范, JPA 即 Java Persistence API。JPA 是一个基于 O/R 映射的标准协议(目前最新版本是 JPA 2.1)。所谓规范即只定义标准规制(如注解、接口),不提供实现,软件提供商可以按照标准规范来实现,而使用者只需按照规范中定义的方式来使用,而不用和软件提供商的实现打交道。JPA 的主要实现由 Hibernate 、 EclipseLink 和 OpenJPA 等完成,我们只要使用 JPA 来开发,无论是哪一个开发方式都是一样的。

Spring Data JPA 是 Spring Data 的一个子项目,它通过基于 JPA 的 Repository 极大地减少了 JPA 作为数据访问方案的代码量。

简而言之,JPA 是一种 ORM 规范,但并未提供 ORM 实现,而 Hibernate 是一个 ORM 框架,它提供了 ORM 实现。

准备工作
  • IDEA
  • JDK1.8
  • SpringBoot 2.1.3

pom.xml 文件引入的依赖如下:

<?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.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.3.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.nasus</groupId><artifactId>jpa</artifactId><version>0.0.1-SNAPSHOT</version><name>jpa</name><description>jpa Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><!-- JPA 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- web 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- mysql 连接类 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- lombok 依赖 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- 单元测试依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

简单说下,加入 JPA 依赖;mysql 连接类用于连接数据;web 启动类,但凡是 web 应用都需要依赖它;lombok 用于简化实体类。不会的看这篇旧文介绍:SpringBoot 实战 (三) | 使用 LomBok

application.yaml 配置文件
spring:
# 数据库相关datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=trueusername: rootpassword: 123456
# JPA 相关jpa:hibernate:ddl-auto: update   #ddl-auto:设为 create 表示每次都重新建表show-sql: true
repository (dao) 层
package com.nasus.jpa.repository;import com.nasus.jpa.entity.Student;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;/*** Project Name:springboot_jpa_demo <br/>* Package Name:com.nasus.jpa.repository <br/>* Date:2019/2/19 21:37 <br/>* <b>Description:</b> TODO: 描述该类的作用 <br/>* @author <a href="turodog@foxmail.com">nasus</a><br/>*/
@Repository
public interface StudentRepository extends JpaRepository<Student,Integer>, CrudRepository<Student, Integer> {
}

JPARepository 继承关系

从上图,可以看出 JpaRepository 继承于 PangingAndSortingRepository 继承于 CrudRepository 。

CrudRepository 提供基本的增删改查PagingAndSortingRepository 提供分页和排序方法;JpaRepository 提供 JPA 需要的方法。在使用的时候,可以根据具体需要选中继承哪个接口。

使用这些接口的好处有:

  1. 继承这些接口,可以使Spring找到自定义的数据库操作接口,并生成代理类,后续可以注入到Spring容器中;
  2. 可以不写相关的sql操作,由代理类生成
service 层
package com.nasus.jpa.service;import com.nasus.jpa.entity.Student;
import java.util.List;/*** Project Name:springboot_jpa_demo <br/>* Package Name:com.nasus.jpa.service <br/>* Date:2019/2/19 21:41 <br/>* <b>Description:</b> TODO: 描述该类的作用 <br/>* @author <a href="turodog@foxmail.com">nasus</a><br/>*/
public interface StudentService {Student save(Student student);Student findStudentById(Integer id);void delete(Integer id);void updateStudent(Student student);List<Student> findStudentList();
}

实现类:

package com.nasus.jpa.service.impl;import com.nasus.jpa.entity.Student;
import com.nasus.jpa.repository.StudentRepository;
import com.nasus.jpa.service.StudentService;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** Project Name:springboot_jpa_demo <br/>* Package Name:com.nasus.jpa.service.impl <br/>* Date:2019/2/19 21:43 <br/>* <b>Description:</b> TODO: 描述该类的作用 <br/>* @author <a href="turodog@foxmail.com">nasus</a><br/>*/
@Service
public class StudentServiceImpl implements StudentService {@Autowiredprivate StudentRepository studentRepository;/*** 保存学生信息* @param student* @return*/@Overridepublic Student save(Student student) {return studentRepository.save(student);}/*** 根据 Id 查询学生信息* @param id* @return*/@Overridepublic Student findStudentById(Integer id) {return studentRepository.findById(id).get();}/*** 删除学生信息* @param id*/@Overridepublic void delete(Integer id) {Student student = this.findStudentById(id);studentRepository.delete(student);}/*** 更新学生信息* @param student*/@Overridepublic void updateStudent(Student student) {studentRepository.save(student);}/*** 查询学生信息列表* @return*/@Overridepublic List<Student> findStudentList() {return studentRepository.findAll();}
}
controller 层构建 restful API
package com.nasus.jpa.controller;import com.nasus.jpa.entity.Student;
import com.nasus.jpa.service.StudentService;
import java.util.List;
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.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** Project Name:springboot_jpa_demo <br/>* Package Name:com.nasus.jpa.controller <br/>* Date:2019/2/19 21:55 <br/>* <b>Description:</b> TODO: 描述该类的作用 <br/>* @author <a href="turodog@foxmail.com">nasus</a><br/>*/
@RestController
@RequestMapping("/student")
public class StudentController {@Autowiredprivate StudentService studentService;@PostMapping("/save")public Student saveStudent(@RequestBody Student student){return studentService.save(student);}@GetMapping("/{id}")public Student findStudentById(@PathVariable("id") Integer id){return studentService.findStudentById(id);}@GetMapping("/list")public List<Student> findStudentList(){return studentService.findStudentList();}@DeleteMapping("/{id}")public void deleteStudentById(@PathVariable("id") Integer id){studentService.delete(id);}@PutMapping("/update")public void updateStudent(@RequestBody Student student){studentService.updateStudent(student);}
}
测试结果

根据 Id 查询学生信息的测试结果

其他接口已通过 postman 测试,无问题。

源码下载:https://github.com/turoDog/Demo/tree/master/springboot_jpa_demo

后语

以上为 SpringBoot 使用 Spring Data JPA 访问 Mysql 数据库的教程。最后,对 Python 、Java 感兴趣请长按二维码关注一波,我会努力带给你们价值,如果觉得本文对你哪怕有一丁点帮助,请帮忙点好看,让更多人知道。

另外,关注之后在发送 1024 可领取免费学习资料。资料内容详情请看这篇旧文:Python、C++、Java、Linux、Go、前端、算法资料分享

这篇关于SpringBoot 实战 (八) | 使用 Spring Data JPA 访问 Mysql 数据库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/940542

相关文章

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操