Springboot框架整合Spring Data JPA操作数据

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Spring Data JPA是Spring基于ORM和JPA规范封装的框架,简化了数据库操作,提供增删改查等接口,并可通过方法名自动生成查询。集成到Spring Boot需添加相关依赖并配置数据库连接和JPA设置。基础用法包括定义实体类和Repository接口,通过Repository接口可直接进行数据操作。此外,JPA支持关键字查询,如通过`findByAuthor`自动转换为SQL的`WHERE author=?`查询。

一、 Sping Data JPA 简介

Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套 JPA 应用框架,底层使用了 Hibernate 的 JPA 技术实现,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能接口,且易于扩展!学习并使用 Spring Data JPA 可以极大提高开发效率!

由于微服务系统的广泛应用,服务粒度逐渐细化,多表关联查询的场景一定程度减少。单表查询和单表的数据操作正是JPA的优势。我们本节就为大家介绍如何在Spring Boot中使用JPA。

二、 将Spring Data JPA集成到Spring Boot

第一步:引入maven依赖包,包括Spring Data JPA和Mysql的驱动

   <dependency>

       <groupId>org.springframework.boot</groupId>

       <artifactId>spring-boot-starter-data-jpa</artifactId>

   </dependency>

    <dependency>

       <groupId>mysql</groupId>

       <artifactId>mysql-connector-java</artifactId>

   </dependency>

第二步:修改application.yml,配置好数据库连接和jpa的相关配置

   spring:

     datasource:

       url: jdbc:mysql://192.168.161.3:3306/testdb?useUnicode=true&characterEncoding=utf-8&useSSL=false

       username: test

       password: 4rfv$RFV

       driver-class-name: com.mysql.jdbc.Driver

     jpa:

       database-platform: org.hibernate.dialect.MySQL5InnoDBDialect

       hibernate:

         ddl-auto: validate

       database: mysql

       show-sql: true

   spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect 。Hibernate 创建数据库表的时候,默认使用的数据库存储引擎是 MyISAM ,这个参数作用是在建表的时候,将存储引擎切换为 InnoDB 。

   spring.jpa.show-sql=true 在日志中打印出执行的 SQL 语句信息。

   spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置属性,其主要作用是:自动根据实体类的定义创建、更新、验证数据库表结构。所以这个参数是一个比较危险的参数,使用的时候一定要注意。该参数的几种配置如下:

       create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。

       create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。

       update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。

       validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

   作为一个谨慎的程序员,我永远将spring.jpa.properties.hibernate.hbm2ddl.auto的值设置为validate。在生产环境上的任何一次配置失误都可能导致数据库表结构变化甚至drop数据丢失。可能有的同学会觉得JPA(hibernate)的这种方式自动建表更新表结构,面向程序员很友好,但是我可以负责任的说:在生产环境下这是最不友好的方式。表还是要通过模型去设计、通过SQL去创建,不要用这种根据model类生成数据库表结构的方式!

三、 基础核心用法

我们来实现一个简单的使用JPA操作数据库的例子。

3.1.实体Model类

   @Data

   @AllArgsConstructor

   @NoArgsConstructor

   @Builder

   @Entity

   @Table(name="article")

   public class Article {

   

       @Id

       @GeneratedValue(strategy=GenerationType.IDENTITY)

       private Long id;

   

       @Column(nullable = false,length = 32)

       private String author;

   

       @Column(nullable = false, unique = true,length = 32)

       private String title;

   

       @Column(length = 512)

       private String content;

   

       private Date createTime;

   }

   @Entity 必选注解,表示这个类是一个实体类,接受JPA控制管理,对应数据库中的一个表

   @Table 可选注解,指定这个类对应数据库中的表名。如果这个类名和数据库表名符合驼峰及下划线规则,可以省略这个注解。如FlowType类名对应表名flow_type。

   @Id 指定这个字段为表的主键

   @GeneratedValue(strategy=GenerationType.IDENTITY) 指定主键的生成方式,一般主键为自增的话,就采用GenerationType.IDENTITY的生成方式

   @Column 注解针对一个字段,对应表中的一列。nullable = false表示数据库字段不能为空, unique = true表示数据库字段不能有重复值,length = 32表示数据库字段最大程度为32.

关于更多注解的详细用法,请参考:# Hibernate Annotations 参考文档

3.2.数据操作接口

   public interface ArticleRepository extends JpaRepository<Article,Long> {

   }

XxxRepository继承 JpaRepository<T,ID>为我们提供了各种针对单表的数据操作方法:增删改查。只要你不是完全英语小白,通过调用接口的方法名称就能知道方法是做什么操作的。

四、写一个服务层调用的例子

4.1.service层接口:

定义一个service层接口

   

   public interface ArticleRestService {

   

        ArticleVO saveArticle(ArticleVO article);

   

        void deleteArticle(Long id);

   

        void updateArticle(ArticleVO article);

   

        ArticleVO getArticle(Long id);

   

        List<ArticleVO> getAll();

   }

   

4.2.service层接口实现

   @Service

   public class ArticleJPARestService implements  ArticleRestService  {

   

       //将JPA仓库对象注入

       @Resource

       private ArticleRepository articleRepository;

   

       @Resource

       private Mapper dozerMapper;

   

       public ArticleVO saveArticle( ArticleVO article) {

   

           Article articlePO = dozerMapper.map(article,Article.class);

           //保存一个对象到数据库,insert

           articleRepository.save(articlePO);    

   

           return  article;

       }

   

       @Override

       public void deleteArticle(Long id) {

            //根据id删除1条数据库记录

           articleRepository.deleteById(id);  

       }

   

       @Override

       public void updateArticle(ArticleVO article) {

           Article articlePO = dozerMapper.map(article,Article.class);

           //更新一个对象到数据库,仍然使用save方法,实际是根据articlePO.id去update

           articleRepository.save(articlePO);    

       }

   

       @Override

       public ArticleVO getArticle(Long id) {

           Optional<Article> article = articleRepository.findById(id);  

            //根据id查找一条数据

           return dozerMapper.map(article.get(),ArticleVO.class);

       }

   

       @Override

       public List<ArticleVO> getAll() {

           List<Article> articleLis = articleRepository.findAll();  

           //查询article表的所有数据

           return DozerUtils.mapList(articleLis,ArticleVO.class);

       }

   }

注意:虽然新增和修改都是使用的save方法,但是完成的功能是不一样的。当保存的对象有主键id的时候,save方法会根据id更新记录;当保存的对象没有主键id的时候,save方法会向数据库里面insert一条记录。

然后大家可以在控制层调用一下service层方法,用postman测试一下.

五、关键字查询接口

除了上文中JpaRepository为我们提供的增删改查的方法。我们还可以自定义方法,使用起来非常简单,甚至可以说是强大。把下面的方法名放到ArticleRepository 里面,它就自动为我们实现了通过author字段查找article表的所有数据。也就是说,我们使用了find(查找)关键字,JPA就自动将方法名为我们解析成数据库SQL操作,太智能了。

       //注意这个方法的名称,jPA会根据方法名自动生成SQL执行

       Article findByAuthor(String author);

等同于

   SELECT *

   FROM article

   WHERE  author = ?

其他具体的关键字,使用方法和生产成 SQL 如下表所示

关键字 接口函数例子 JPQL 片段

And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2

Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2

Is,Equals findByFirstnameIs,findByFirstnameEquals … where x.firstname = ?1

Between findByStartDateBetween … where x.startDate between ?1 and ?2

LessThan findByAgeLessThan … where x.age < ?1

LessThanEqual findByAgeLessThanEqual … where x.age ⇐ ?1

GreaterThan findByAgeGreaterThan … where x.age > ?1

GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1

After findByStartDateAfter … where x.startDate > ?1

Before findByStartDateBefore … where x.startDate < ?1

IsNull findByAgeIsNull … where x.age is null

IsNotNull,NotNull findByAge(Is)NotNull … where x.age not null

Like findByFirstnameLike … where x.firstname like ?1

NotLike findByFirstnameNotLike … where x.firstname not like ?1

StartingWith findByFirstnameStartingWith … where x.firstname like ?1 (parameter bound with appended %)

EndingWith findByFirstnameEndingWith … where x.firstname like ?1 (parameter bound with prepended %)

Containing findByFirstnameContaining … where x.firstname like ?1 (parameter bound wrapped in %)

OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc

Not findByLastnameNot … where x.lastname <> ?1

In findByAgeIn(Collection ages) … where x.age in ?1

NotIn findByAgeNotIn(Collection age) … where x.age not in ?1

TRUE findByActiveTrue() … where x.active = true

FALSE findByActiveFalse() … where x.active = false

IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstame) = UPPER(?1)

可以看到我们这里没有任何类SQL语句就完成了两个条件查询方法。这就是Spring-data-jpa的一大特性:通过解析方法名创建查询。针对单表的数据查询简单到令人发指,怎么可以这么简单,照这个趋势发展,程序员早晚失业。

六、测试关键字查询

   @RunWith(SpringRunner.class)

   @SpringBootTest

   public class JPAKeyWordTest {

   

       @Resource

       private ArticleRepository articleRepository;

     

       @Test

       public void userTest() {

           Article article = articleRepository.findByAuthor("zimug");

           System.out.println(article);

       }

   

   }

   

七、其他

Spring-data-jpa的能力远不止本文提到的这些,本教程作为spring boot系列教程,并不能将spring data jpa的方方面面讲到,其实,本文已经介绍了JPA最常用的用法中的80%,笔者不建议使用Query、NamedQuery、Specification、QueryDSL等,如果你用这些东西,还不如自己写SQL。 当然,JPA的深度用户,也许会不同意我的说法,那么请参考下方文档进行更深入的学习:


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6天前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
21 4
|
8天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
58 1
|
10天前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
53 2
|
3天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
8 0
|
10天前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
22 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
11天前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
10天前
|
Web App开发 JavaScript Java
elasticsearch学习五:springboot整合 rest 操作elasticsearch的 实际案例操作,编写搜索的前后端,爬取京东数据到elasticsearch中。
这篇文章是关于如何使用Spring Boot整合Elasticsearch,并通过REST客户端操作Elasticsearch,实现一个简单的搜索前后端,以及如何爬取京东数据到Elasticsearch的案例教程。
103 0
elasticsearch学习五:springboot整合 rest 操作elasticsearch的 实际案例操作,编写搜索的前后端,爬取京东数据到elasticsearch中。
|
10天前
|
机器学习/深度学习 移动开发 自然语言处理
基于人工智能技术的智能导诊系统源码,SpringBoot作为后端服务的框架,提供快速开发,自动配置和生产级特性
当身体不适却不知该挂哪个科室时,智能导诊系统应运而生。患者只需选择不适部位和症状,系统即可迅速推荐正确科室,避免排错队浪费时间。该系统基于SpringBoot、Redis、MyBatis Plus等技术架构,支持多渠道接入,具备自然语言理解和多输入方式,确保高效精准的导诊体验。无论是线上医疗平台还是大型医院,智能导诊系统均能有效优化就诊流程。
|
11天前
|
前端开发 Java 数据库
springBoot:template engine&自定义一个mvc&后端给前端传数据&增删改查 (三)
本文介绍了如何自定义一个 MVC 框架,包括后端向前端传递数据、前后端代理配置、实现增删改查功能以及分页查询。详细展示了代码示例,从配置文件到控制器、服务层和数据访问层的实现,帮助开发者快速理解和应用。
|
14天前
|
SQL Java 数据库连接
springBoot+Jpa(hibernate)数据库基本操作
springBoot+Jpa(hibernate)数据库基本操作
22 0