SpringBoot2.x系列教程29--SpringBoot整合JPA框架实现数据库CRUD操作

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 前言在上一章节中,壹哥 带大家在Spring Boot中整合了Mybatis框架,虽然Mybatis进行数据库操作已经很简单了,但是作为一个程序员,我们就得有追求极致的精神,就要想一下,还有没有第3种方式可以进行数据库操作呢?其实是有的!所以在这一章节中,我会继续带领大家学习在Spring Boot中整合JPA框架,利用JPA来实现数据库的操作。一. JPA简介1. JPA概念JPA是Sun官方提出的Java持久化规范,是Java Persistence API的简称,中文名‘Java持久层API’,它本质上是一种ORM规范。JPA通过 JDK 5.0 的 注解或XML 两

前言

在上一章节中,壹哥 带大家在Spring Boot中整合了Mybatis框架,虽然Mybatis进行数据库操作已经很简单了,但是作为一个程序员,我们就得有追求极致的精神,就要想一下,还有没有第3种方式可以进行数据库操作呢?

其实是有的!

所以在这一章节中,我会继续带领大家学习在Spring Boot中整合JPA框架,利用JPA来实现数据库的操作。

一. JPA简介

1. JPA概念

JPA是Sun官方提出的Java持久化规范,是Java Persistence API的简称,中文名‘Java持久层API’,它本质上是一种ORM规范。

JPA通过 JDK 5.0 的 注解或XML 两种形式来描述 ‘对象--关系表’ 的映射关系,并将运行期的实体对象持久化到数据库中。

2. JPA出现的原因

Sun引入 JPA 规范是出于两个原因:

  • 简化现有Java EE和Java SE的开发工作;
  • Sun希望整合ORM技术,实现天下归一。

也就是说,Sun提出JPA规范的目的就是想以官方身份来统一各种ORM框架的规范,包括著名的Hibernate、TopLink等。这样就可以避免开发者为了使用Hibernate,要学习一套ORM框架;为了使用TopLink框架,又要再学习一套ORM框架,免去了重复学习的过程!

3. JPA涵盖的技术

JPA的总体思想和现有的Hibernate、TopLink、JDO、Mybatis等ORM框架大体一致。总的来说,JPA包括以下3方面的技术:

(1). ORM映射元数据

JPA支持XML和JDK 5.0中的注解两种形式,通过元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。

(2). JPA的API

用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。

(3). 查询语言

通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

4. JPA与其他ORM框架的关系

JPA的本质是一种ORM规范(不是ORM框架,因为JPA并未提供ORM实现,只是制定了规范),而非实现。

它只提供了一些相关的接口,但是这些接口并不能直接使用,JPA的底层需要某种JPA实现,而Hibernate等框架则是对JPA的一种具体实现。

也就是说JPA仅仅是一套规范,而不是一套产品, Hibernate, TopLink等都是实现了JPA规范的一套产品。

Hibernate 从3.2开始,就开始兼容JPA。Hibernate3.2获得了Sun TCK的 JPA(Java  Persistence API)兼容认证。所以JPA和Hibernate之间的关系,可以简单的理解为JPA是标准接口,Hibernate是实现,他们之间并不是对标的关系,下图可以表明他们之间的关系。

Hibernate属于遵循JPA规范的一种实现,但是Hibernate还有其他要实现的规范,所以它们的关系如下:

JPA是一种做面条的标准规范,而Hibernate是一种遵循做面条规范的具体的汤面,Hibernate不仅遵循了做面条的规范,同时也会遵循做汤和调料的其他规范。

5. JPA中的注解

二. Spring Boot整合JPA实现过程

1. 创建web程序

我们按照之前的经验,创建一个SpringBoot的Web程序,具体过程略,各位可以参考下图创建。

2. 添加依赖包

我们在pom.xml文件中添加如下依赖包。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency>

3. 添加配置文件

接下来创建一个application.yml配置文件,在这里添加数据库的配置信息。

spring:  datasource:    url: jdbc:mysql://localhost:3306/db4?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
    type: com.alibaba.druid.pool.DruidDataSource
    username: root
    password: syc
    driver-class-name: com.mysql.jdbc.Driver #驱动  jpa:    hibernate:      ddl-auto: update #自动更新    show-sql: true  #日志中显示sql语句

其中jpa.hibernate.ddl-auto是hibernate的配置属性,其主要作用是:自动创建、更新、验证数据库表结构。该参数的几种配置选型如下:

  • create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
  • create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
  • update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
  • validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

4. 创建实体类

封装一个与数据库表对应的实体类。

packagecom.yyg.boot.domain;
importlombok.Data;
importlombok.ToString;
importjavax.persistence.Column;
importjavax.persistence.Entity;
importjavax.persistence.GeneratedValue;
importjavax.persistence.Id;
/*** @Author 一一哥Sun* @Date Created in 2020/3/30* @Description Description*/@Data@ToString@EntitypublicclassUser {
@Id@GeneratedValue(strategy=GenerationType.IDENTITY)
privateLongid;
@ColumnprivateStringusername;
@ColumnprivateStringbirthday;
@ColumnprivateStringsex;
@ColumnprivateStringaddress;
}

5. 创建DataSource配置类

编写一个数据源配置类,关联我们applicaiton.yml中的配置信息。

packagecom.yyg.boot.config;
importcom.alibaba.druid.pool.DruidDataSource;
importlombok.Data;
importorg.springframework.boot.context.properties.ConfigurationProperties;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.ComponentScan;
importorg.springframework.context.annotation.Configuration;
importjavax.sql.DataSource;
/*** @Author 一一哥Sun* @Date Created in 2020/3/30* @Description 第二种配置数据源的方式*/@Data@ComponentScan@Configuration@ConfigurationProperties(prefix="spring.datasource")
publicclassDbConfig {
privateStringurl;
privateStringusername;
privateStringpassword;
@BeanpublicDataSourcegetDataSource() {
DruidDataSourcedataSource=newDruidDataSource();
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
returndataSource;
    }
}

6. 创建JPA实体仓库

常规的数据库操作,如果使用JPA会非常简单,我们只需要继承一个父接口JpaRepository,并设置泛型,即可实现对User类的增删改查操作。

packagecom.yyg.boot.repository;
importcom.yyg.boot.domain.User;
importorg.springframework.data.jpa.repository.JpaRepository;
/*** @Author 一一哥Sun* @Date Created in 2020/3/31* @Description Description*/publicinterfaceUserRepositoryextendsJpaRepository<User, Long> {
}

7. 创建Controller测试接口

我们编写一个Controller,定义几个RESTful风格的URL接口。

packagecom.yyg.boot.web;
importcom.yyg.boot.domain.User;
importcom.yyg.boot.repository.UserRepository;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.web.bind.annotation.*;
importjava.util.List;
/*** @Author 一一哥Sun* @Date Created in 2020/3/31* @Description Description*/@RestController@RequestMapping("/user")
publicclassUserController {
@AutowiredprivateUserRepositoryuserRepository;
@GetMapping("")
publicList<User>findUsers() {
returnuserRepository.findAll();
    }
/*** 注意:记得添加@RequestBody注解,否则前端传递来的json数据无法被封装到User中!*/@PostMapping("")
publicUseraddUser(@RequestBodyUseruser) {
returnuserRepository.save(user);
    }
@DeleteMapping(path="/{id}")
publicStringdeleteById(@PathVariable("id") Longid) {
userRepository.deleteById(id);
return"success";
    }
}

8. 创建Application启动类

最后创建一个启动类,将项目启动起来。

packagecom.yyg.boot;
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
/*** @Author 一一哥Sun* @Date Created in 2020/3/31* @Description Description*/@SpringBootApplicationpublicclassJpaApplication {
publicstaticvoidmain(String[] args) {
SpringApplication.run(JpaApplication.class, args);
    }
}

9. 完整项目结构

最后完整的项目结构如下图所示,各位可以参考创建。

10. 测试接口

接下来我们对上面定义的URL接口进行测试。

10.1 在浏览器中进行get查询

10.2 在postman中执行添加操作

10.3 在postman中执行删除操作

三. JPA实现原理

掌握了JPA的用法,我再对JPA的实现原理做个基本的讲解。

JPA会根据方法名来生成SQL查询语句,它遵循的是Convention over configuration(约定大约配置)的原则,遵循Spring 以及JPQL定义的方法命名。
Spring提供了一套可以通过命名规则进行查询构建的机制,这套机制会把方法名首先过滤一些关键字,比如 find…By, read…By, query…By, count…By 和 get…By...

然后系统会根据关键字将命名解析成2个子语句,第一个 By 是区分这两个子语句的关键词。这个 By 之前的子语句是查询子语句(指明返回要查询的对象),后面的部分是条件子语句。

如果直接就是 findBy… 返回的就是定义Respository时指定的领域对象集合,同时JPQL中也定义了丰富的关键字:and、or、Between等等,下面我们来看一下JPQL中有哪些关键字:

结语

至此,壹哥 就跟各位普及了JPA的用法,这样3种操作数据库的方式对比下来,你会发现最简单的是JPA。当然,我们在开发时,到底选择哪种框架,还是取决于项目的需求和公司规定。

今日小作业:

请选择你喜欢的一个数据库框架,实现学生信息的CRUD操作。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
16
分享
相关文章
PolarDB 开源基础教程系列 8 数据库生态
PolarDB是一款开源的云原生分布式数据库,源自阿里云商业产品。为降低使用门槛,PolarDB携手伙伴打造了完整的开源生态,涵盖操作系统、芯片、存储、集成管控、监控、审计、开发者工具、数据同步、超融合计算、ISV软件、开源插件、人才培养、社区合作及大型用户合作等领域。通过这些合作伙伴,PolarDB提供了丰富的功能和服务,支持多种硬件和软件环境,满足不同用户的需求。更多信息请访问[PolarDB开源官方网站](https://openpolardb.com/home)。
54 4
新手教程:数据库操作(使用PDO或MySQLi扩展)
本文为新手介绍如何使用PDO和MySQLi扩展连接与操作MySQL数据库。PDO更现代灵活,支持多种数据库,适合大多数应用;MySQLi提供面向过程和面向对象两种API,适合直接控制数据库操作。教程涵盖安装配置、创建连接、执行查询(查询、插入、更新、删除)及错误处理等内容。希望这篇教程能帮助你快速上手PHP中的数据库操作!
164 32
基于SpringBoot+Vue实现的大学生就业服务平台设计与实现(系统源码+文档+数据库+部署等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
85 6
基于SpringBoot+Vue的班级综合测评管理系统设计与实现(系统源码+文档+数据库+部署等)
✌免费选题、功能需求设计、任务书、开题报告、中期检查、程序功能实现、论文辅导、论文降重、答辩PPT辅导、会议视频一对一讲解代码等✌
57 4
基于SpringBoot+Vue实现的大学生体质测试管理系统设计与实现(系统源码+文档+数据库+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
48 2
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
73 2
基于SpringBoot+Vue实现的冬奥会科普平台设计与实现(系统源码+文档+数据库+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
55 0
使用 Spring Boot 执行数据库操作:全面指南
使用 Spring Boot 执行数据库操作:全面指南
358 1
南大通用GBase 8s数据库onbar基础使用教程
数据备份与恢复是确保数据安全和业务连续性的关键。onbar作为GBase 8s数据库的备份工具,需配合存储管理器使用,通过配置BAR_BSALIB_PATH等参数,实现数据的备份与恢复。本文详细介绍了onbar的配置、备份、恢复及监控流程,帮助数据库管理员构建高效的数据保护方案。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等