spring boot 中使用 jpa以及jpa介绍

article/2025/9/18 8:18:11

最近在项目中使用了一下jpa,发现还是挺好用的。这里就来讲一下jpa以及在spring boot中的使用。
在这里我们先来了解一下jpa。

1.什么是jpa呢?

JPA顾名思义就是Java Persistence API的意思,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

2.jpa具有什么优势?

2.1标准化
JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。
2.2容器级特性的支持
JPA框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。
2.3简单方便
JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity进行注释,JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易的掌握。JPA基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成。
2.4查询能力
JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是Hibernate HQL的等价物。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。
2.4高级特性
JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。

3.基于注解的使用

本篇只介绍注解的使用,另一种基于xml方式的使用大家有兴趣可以自行了解一下。

3.1 JPA拥有哪些注解呢?

注解解释
@Entity声明类为实体或表。
@Table声明表名。
@Basic指定非约束明确的各个字段。
@Embedded指定类或它的值是一个可嵌入的类的实例的实体的属性。
@Id指定的类的属性,用于识别(一个表中的主键)。
@GeneratedValue指定如何标识属性可以被初始化,例如自动、手动、或从序列表中获得的值。
@Transient指定的属性,它是不持久的,即:该值永远不会存储在数据库中。
@Column指定持久属性栏属性。
@SequenceGenerator指定在@GeneratedValue注解中指定的属性的值。它创建了一个序列。
@TableGenerator指定在@GeneratedValue批注指定属性的值发生器。它创造了的值生成的表。
@AccessType这种类型的注释用于设置访问类型。如果设置@AccessType(FIELD),则可以直接访问变量并且不需要getter和setter,但必须为public。如果设置@AccessType(PROPERTY),通过getter和setter方法访问Entity的变量。
@JoinColumn指定一个实体组织或实体的集合。这是用在多对一和一对多关联。
@UniqueConstraint指定的字段和用于主要或辅助表的唯一约束。
@ColumnResult参考使用select子句的SQL查询中的列名。
@ManyToMany定义了连接表之间的多对多一对多的关系。
@ManyToOne定义了连接表之间的多对一的关系。
@OneToMany定义了连接表之间存在一个一对多的关系。
@OneToOne定义了连接表之间有一个一对一的关系。
@NamedQueries指定命名查询的列表。
@NamedQuery指定使用静态名称的查询。

了解了注解之后我们来看看如何使用吧

4.代码实战

4.1maven依赖

添加jpa起步依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency>

4.2配置文件

在application.yml文件中添加如下配置

spring:datasource:url: jdbc:mysql://localhost:3306/mytesttype: com.alibaba.druid.pool.DruidDataSourceusername: rootpassword: rootdriver-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.3创建实体以及数据访问接口

首先来看一下实体类Person.java

@Entity
@Getter
@Setter
public class Person {@Id@GeneratedValueprivate Long id;@Column(name = "name", nullable = true, length = 20)private String name;@Column(name = "agee", nullable = true, length = 4)private int age;
}

接着是PersonRepository.java,改接口只需要继承JpaRepository接口即可。

public interface PersonRepository extends JpaRepository<Person, Long> {
}

然后写一个rest接口以供测试使用。

@RestController
@RequestMapping(value = "person")
public class PerconController {@Autowiredprivate PersonRepository personRepository;@PostMapping(path = "addPerson")public void addPerson(Person person) {personRepository.save(person);}@DeleteMapping(path = "deletePerson")public void deletePerson(Long id) {personRepository.delete(id);}
}

好了,让我们来运行一下程序看看结果吧,启动程序,查询数据库我们就可以看到,JPA以及自动帮我们创建了表
这里写图片描述

接下来我们调用一下addPerson接口。我们使用postman来测试:
这里写图片描述
然后通过查询数据库来看一下结果:
这里写图片描述
我们可以看到成功插入了数据,并且观察表结构可以看到,agee是我们定义的column名称,id为自增。并且从上面的repository接口代码我们可以看到,接口中并没有定义任何的方法,这是因为JpaRepository中帮我们定义了基础的增删改查方法,可以很方便的直接使用。

接下来我们来看一下如何编写自己的方法。我们以根据name查询person为例。添加一个rest接口

    @GET@Produces(TYPE_JSON)@Path("getPerson")public Object getPerson(@QueryParam("name") String name) {return personRepository.findByName(name);}

并在repository接口中添加如下查询方法:

Person findByName(String name);

重启之后让我们来看一下查询结果

这里写图片描述
我们可以看到通过name获取到了想要的结果。我们也可以在日志中看到hibernate输出的日志:

Hibernate: select person0_.id as id1_0_, person0_.agee as agee2_0_, person0_.name as name3_0_ from person person0_ where person0_.name=?

那么JPA是通过什么规则来根据方法名生成sql语句查询的呢?
其实JPA在这里遵循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中有哪些关键字:

KeywordSampleJPQL snippet
AndfindByLastnameAndFirstname… where x.lastname = ?1 and
OrfindByLastnameOrFirstname… where x.lastname = ?1 or x.firstname = ?2
Is,EqualsfindByFirstnameIs,findByFirstnameEquals… where x.firstname = ?1
BetweenfindByStartDateBetween… where x.startDate between ?1 and ?2
LessThanfindByAgeLessThan… where x.age < ?1
LessThanEqualfindByAgeLessThanEqual… where x.age ⇐ ?1
GreaterThanfindByAgeGreaterThan… where x.age > ?1
GreaterThanEqualfindByAgeGreaterThanEqual… where x.age >= ?1
AfterfindByStartDateAfter… where x.startDate > ?1
BeforefindByStartDateBefore… where x.startDate < ?1
IsNullfindByAgeIsNull… where x.age is null
IsNotNull,NotNullfindByAge(Is)NotNull… where x.age not null
LikefindByFirstnameLike… where x.firstname like ?1
NotLikefindByFirstnameNotLike… where x.firstname not like ?1
StartingWithfindByFirstnameStartingWith… where x.firstname like ?1 (parameter bound with appended %)
EndingWithfindByFirstnameEndingWith… where x.firstname like ?1 (parameter bound with prepended %)
ContainingfindByFirstnameContaining… where x.firstname like ?1 (parameter bound wrapped in %)
OrderByfindByAgeOrderByLastnameDesc… where x.age = ?1 order by x.lastname desc
NotfindByLastnameNot… where x.lastname <> ?1
InfindByAgeIn(Collection ages)… where x.age in ?1
NotInfindByAgeNotIn(Collection age)… where x.age not in ?1
TRUEfindByActiveTrue()… where x.active = true
FALSEfindByActiveFalse()… where x.active = false
IgnoreCasefindByFirstnameIgnoreCase… where UPPER(x.firstame) = UPPER(?1)
……

以上就是jpa的简单实用和介绍。


http://chatgpt.dhexx.cn/article/3FeddLPc.shtml

相关文章

JPA是什么

JPA仅仅是一种规范&#xff0c;也就是说JPA仅仅定义了一些接口&#xff0c;而接口是需要实现才能工作的。所以底层需要某种实现&#xff0c;而Hibernate就是实现了JPA接口的ORM框架。 也就是说&#xff1a; JPA是一套ORM规范&#xff0c;Hibernate实现了JPA规范&#xff01;如…

数据中台(一)数据中台详解

1.数据中台的由来 数据库阶段 ---> 传统数仓 ---> 大数据平台 ----> 大数据中台 1.1.数据存储起源&#xff1a;数据库 1979年&#xff1a;Oracle1.0商用数据库发布 1996年&#xff1a;MySQL1.0发布&#xff0c;到2000年以后开始火起来。 特点&#xff1a;数据库主要面…

通俗易懂解释什么是“中台”

通俗易懂解释什么是“中台” 随着互联网公司崛起&#xff0c;“中台”这个词也进入了人们的视线。BAT 等公司纷纷推出了自己的中台系统。那么&#xff0c;什么是中台系统&#xff1f;它是如何诞生的&#xff1f;它长什么模样&#xff1f;我们为什么需要它&#xff1f;一串串的问…

什么是中台

什么是中台&#xff1f; 前台 由各类前台系统组成的前端平台。每个前台系统就是一个用户触点&#xff0c;即企业的最终用户直接使用或交互的系统&#xff0c;是企业与最终用户的交点。列如用户直接使用的网站&#xff0c;手机APP&#xff0c;微信公众号都属于前台范畴。 中台&…

什么是“中台”?

“中台”这个概念&#xff0c;越来越多的在各种技术大会上提及&#xff0c;各大技术公司&#xff0c;纷纷推出自己的“中台”方案&#xff0c;究竟什么是“中台”&#xff1f;他和“前台”、“后台”有何区别&#xff1f; 《》&#xff0c;这是我的朋友、前同事小灰写的一篇漫画…

中台架构

中台是什么 企业互联网中台架构&#xff0c;简称中台&#xff0c;起源于阿里巴巴&#xff0c;不同的人对中台有不同解读。 我认为&#xff0c;中台可定义为&#xff1a;中台是一套结合互联网技术和行业特性&#xff0c;将企业核心能力以共享服务中心进行沉淀&#xff0c;形成“…

数据中台架构体系理解

目前&#xff0c;大部分企业更倾向于数据集中采集、存储&#xff0c;并应用分层建设。这种方式一方面有利于应用系统的快速部署&#xff0c;另一方面也保证了数据的集中管理与运营&#xff0c;体现数据的资产、资源属性。 数据中台的出现弥补了数据开发和应用开发之间由于开发…

业务中台和数据中台的区别

中台里面有两个很重要的中台&#xff0c;一个是业务中台&#xff0c;一个是数据中台。 业务中台是提供可复用的业务&#xff0c;API数据中台是提供数据洞察和智能的。 不管什么中台&#xff0c;它实际上都是平台思想的一个体现&#xff0c;一种具象。 二者的联系 数据中台从业…

数据中台详解

文章目录 什么是数据中台数据中台 VS 数据仓库数据中台的业务价值与技术价值 数据中台建设与架构数据中台建设方法论数据中台架构 数据汇聚联通&#xff1a;打破企业数据孤岛数据采集、汇聚的方法和工具数据交换 数据体系建设数据体系规划统一数仓层建设——标准化的数据底座相…

数据中台(七) 数据中台架构

总体架构图 数据存储 计算引擎 数据汇聚 数据汇聚是把数据资源通过实时、批量的方式存储到数据中台。基本是按照数据的原始状态堆砌在一起的&#xff0c;是企业对过往所有IT信息化建设积累的成果的融合。 数据开发 数据开发是数据资产内容建设的主战场&#xff0c;是数据价值…

什么是中台?

文章目录 中台——为前台而生一、没有中台的时代——传统项目二、中台的出现背景&#xff08;1&#xff09;国外&#xff08;最先&#xff09;&#xff08;2&#xff09;国内&#xff08;部分&#xff09;A. 阿里巴巴B. 华为 三、什么是中台四、为什么要做中台五、前中后台三者…

详解什么是中台?

什么是中台 最近被老板折腾得够呛&#xff0c;我们老板听说最近中台的概念很火&#xff0c;让我们调研公司实习中台战略的可行性。刚开始并不理解什么是中台… 因此&#xff0c;写篇博客先简单介绍下什么是中台。 要理解中台&#xff0c;要先清楚传统项目架构的痛点在哪里 没有…

传统系统架构与中台架构的区别和联系

SOA架构思想 我们可以来看下SOA本身的定义&#xff0c;即&#xff1a; SOA是一种架构方法&#xff0c;将传统的单片式应用打破&#xff0c;分解为离散的、自治的业务服务&#xff0c;利用标准提升他们的互操作性&#xff0c;从而可以更好地共享、重用和组装&#xff0c;快速构…

中台不同于平台,那么到底啥是中台?

1、哪些不是中台&#xff0c;而是应该叫平台 做开发&#xff0c;有所谓的三层技术架构&#xff1a;前端展示层、中间逻辑层、后端数据层。我们现在讲的中台不在这个维度上。 做开发&#xff0c;还有所谓的技术中间件。一开始我们没有中间件的概念&#xff0c;只有操作系统、数据…

什么是数据中台

转载:https://mp.weixin.qq.com/s/nXI0nSSOneteIClA7dming 没有中台的时代 在传统IT企业&#xff0c;项目的物理结构是什么样的呢&#xff1f;无论项目内部的如何复杂&#xff0c;都可分为“前台”和“后台”这两部分。 什么是前台&#xff1f; 首先&#xff0c;这里所说的“…

到底什么是数据中台?

最近可能大家听到“数据中台”这个词越来越频繁了&#xff0c;有时候我跟一些朋友聊起来&#xff0c;也是都在说这个&#xff0c;但是一直不知道这到底是个什么。最近就看到这篇文章&#xff0c;觉得说的还挺好的&#xff0c;分享给大家看看&#xff0c;希望大家看完能对数据中…

什么是数据中台?

01数据中台的前世今生 在正式进入数据中台建设实践之前&#xff0c;我想花点时间先聊一聊大数据的发展史&#xff0c;这样更能理解数据中台诞生的原因。不管是学习一项知识&#xff0c;还是讨论一个问题&#xff0c;最好的方法都不应该是一头扎进细节里&#xff0c;而是应该先…

什么是中台系统?

查看百度指数&#xff0c;“中台”两字的搜索量从2019年5月21日后开始陡增。 这天发生了什么&#xff1f;这天腾讯召开了“腾讯全球数字生态大会”&#xff0c;在会上&#xff0c;多位腾讯高管提到”开放中台能力&#xff0c;拥抱产品互联网“。至此&#xff0c;“中台”2个字开…

中台系统是什么

中台系统是将企业进行数字化的一种工程。企业通过进行数字化改造的工程建立一条数字化的中台系统&#xff0c;这样可以适应企业的多元化发展。另外也会更加容易与互联网进行衔接。 中台系统是将企业进行数字化的一种工程。企业通过进行数字化改造的工程建立一条数字化的中台系…

前后端分离开发具体实现

一. 前后端分离开发具体实现 1 Visual Studio Code开发工具的安装 双击安装&#xff0c;即可成功 3.1.2 Visual Studio Code开发工具的配置 3.1.2.1、设置中文环境 设置中文环境 安装完毕后&#xff0c;vscode全部都是英文版本的&#xff0c;需要把vscode环境调整为中文…