SpringBoot整合JPA 基礎(chǔ)使用示例教程
一、什么是JPA
1.JPA的定義和基本概念
JPA(Java Persistence API)是Java中用于進行持久化操作的一種規(guī)范,它定義了一系列用于操作關(guān)系型數(shù)據(jù)庫的API接口。通過這些接口,開發(fā)人員可以方便地進行數(shù)據(jù)庫的增刪改查等操作,而無需關(guān)注具體的數(shù)據(jù)庫操作細節(jié)。JPA通過JDK 5.0注解或XML描述對象-關(guān)系表的映射關(guān)系,并將運行期的實體對象持久化到數(shù)據(jù)庫中。
2.JPA的核心概念
JPA的核心概念包括對象-關(guān)系映射(ORM)和實體對象持久化。ORM技術(shù)是一種將對象模型和關(guān)系模型進行映射的技術(shù),通過ORM,開發(fā)人員可以將Java對象直接映射到數(shù)據(jù)庫表中,從而避免了手動編寫SQL語句的繁瑣工作。JPA提供了一套注解和配置方式,可以方便地將Java類與數(shù)據(jù)庫表進行映射,使得開發(fā)人員可以直接操作Java對象,而無需手動維護SQL語句。
3.JPA的用途和目標
JPA的目標是簡化企業(yè)應(yīng)用開發(fā),使得開發(fā)者能夠更容易地實現(xiàn)對象與數(shù)據(jù)庫表之間的映射關(guān)系。它定義了對象-關(guān)系映射(ORM)以及實體對象持久化的標準接口,旨在規(guī)范和簡化Java對象的持久化工作。通過提供統(tǒng)一的API和封裝數(shù)據(jù)庫操作細節(jié),JPA使得開發(fā)人員可以更加方便地進行數(shù)據(jù)庫操作,提高了代碼的可維護性和可讀性。
4.JPA的優(yōu)勢
使用JPA的優(yōu)勢包括提高代碼的可維護性和可讀性。通過使用JPA,開發(fā)人員可以使用面向?qū)ο蟮姆绞絹聿僮鲾?shù)據(jù)庫,無需直接操作SQL語句,這使得代碼更加直觀和易于理解。此外,JPA還提供了一些高級特性,如緩存管理、事務(wù)管理等,這些特性可以幫助開發(fā)人員更好地進行性能優(yōu)化和并發(fā)控制。
二、JPA的使用
1.準備數(shù)據(jù)庫腳本
DROP TABLE IF EXISTS user;
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主鍵ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年齡',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱',
PRIMARY KEY (id)
);2.初始化數(shù)據(jù)
INSERT INTO user (id, name, age, email) VALUES (1, 'Jone', 18, 'test1@baomidou.com'), (2, 'Jack', 20, 'test2@baomidou.com'), (3, 'Tom', 28, 'test3@baomidou.com'), (4, 'Sandy', 21, 'test4@baomidou.com'), (5, 'Billie', 24, 'test5@baomidou.com');
3.xml文件導入依賴
<!-- JPA框架 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>4.引入JPA配置
spring:
jpa:
hibernate:
# ddl-auto 枚舉:
# none(默認):禁用DDL處理
# validate:驗證schema,不對數(shù)據(jù)庫做任何操作
# update:更新schema
# create:創(chuàng)建schema,并銷毀之前數(shù)據(jù)
# create-drop:會話創(chuàng)建時創(chuàng)建schema,會話關(guān)閉時銷毀schema
ddl-auto: update
# jpa配置:在控制臺顯示Hibernate的sql(可選)
show-sql: true(1)加載數(shù)據(jù)庫驅(qū)動,springboot3.0開始mysql驅(qū)動改為com.mysql.cj.jdbc.Driver,而非com.mysql.jdbc.Driver。
(2)jpa底層實現(xiàn)采用hibernate,自動建表配置使用update,表示第一次創(chuàng)建schema,后續(xù)只做更新操作。
5.創(chuàng)建實體對象
import lombok.Data;
import javax.persistence.*;
@Entity
@Data
@Table(name = "user")
public class UserDO {
private static final long serialVersionUID = -2952735933715107252L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Integer age;
private String email;
}6.定義Repository接口
public interface UserRepository extends JpaRepository<UserDO, Long> {
/**
* 根據(jù)用戶姓名查找用戶
*
* @param name 用戶姓名
* @return 找到的用戶對象,如果不存在返回 null
*/
UserDO findByName(String name);
/**
* 根據(jù)用戶姓名或電子郵箱查找用戶
*
* @param name 用戶姓名
* @param email 用戶電子郵箱
* @return 找到的用戶對象,如果不存在返回 null
*/
UserDO findByNameOrEmail(String name, String email);
/**
* 根據(jù)用戶姓名計數(shù)用戶數(shù)量
*
* @param name 用戶姓名
* @return 具有該姓名的用戶數(shù)量
*/
Long countByName(String name);
/**
* 根據(jù)用戶名進行模糊搜索
*
* @param name 用戶姓名(可以包含通配符)
* @return 匹配的用戶列表
*/
List<UserDO> findByNameLike(String name);
/**
* 根據(jù)用戶姓名忽略大小寫查找用戶
*
* @param name 用戶姓名
* @return 找到的用戶對象,如果不存在返回 null
*/
UserDO findByNameIgnoreCase(String name);
/**
* 根據(jù)用戶姓名查找用戶,并按年齡降序排列
*
* @param name 用戶姓名
* @return 匹配的用戶列表,按年齡降序排列
*/
List<UserDO> findByNameContainingOrderByAgeDesc(String name);
/**
* 根據(jù)用戶姓名進行分頁查詢
*
* @param name 用戶姓名
* @param pageable 分頁信息
* @return 包含用戶對象的分頁結(jié)果
*/
Page<UserDO> findByName(String name, Pageable pageable);
}注:Repository接口用于定義對實體對象UserDO進行持久化操作的方法。
7.創(chuàng)建controller層調(diào)用Repository接口方法
這里只是簡單測了根據(jù)ID查詢
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserRepository userRepository;
/**
* 測試單條查詢
*/
@GetMapping("/id")
public void testSelectOne() {
// 從 UserRepository 中查找 ID 為 1 的用戶
Optional<UserDO> user = userRepository.findById(1L);
System.out.println(user);
}
}測試效果:

三、JPA的常用
1.常用注解
注解 | 描述 |
@Entity | 聲明該類為實體類。 |
@Table | 指定實體類映射的數(shù)據(jù)庫表,通常與@Entity注解一起使用。 |
@Id | 聲明實體類的屬性或字段作為數(shù)據(jù)庫表的主鍵。 |
@GeneratedValue | 指定主鍵的生成策略。 |
@Column | 用于標注實體類中的屬性與數(shù)據(jù)庫表中的字段之間的映射關(guān)系。 |
@Transient | 聲明實體類的屬性或字段不是持久化的。 |
@Basic | 指定實體類屬性的存取策略。 |
@Temporal | 指定java.util.Date或java.util.Calendar 屬性映射到數(shù)據(jù)庫類型時的時間精度。 |
@Enumerated | 指定枚舉類型的屬性映射。 |
@OneToOne | 指定一對一的關(guān)聯(lián)映射。 |
@OneToMany | 指定一對多的關(guān)聯(lián)映射。 |
@ManyToOne | 指定多對一的關(guān)聯(lián)映射。 |
@ManyToMany | 指定多對多的關(guān)聯(lián)映射。 |
@JoinColumn | 指定關(guān)聯(lián)的外鍵列。 |
@MapKey | 指定映射關(guān)系中的鍵。 |
2.常用查詢方法
方法類型 | 方法名稱 | 描述 |
查詢方法 | findBy/getBy/queryBy/readBy | 后面跟要查詢的字段名,用于精確匹配。 |
find/get/query/read | 后面跟要查詢的字段名,使用條件表達式進行模糊匹配。 | |
findAll/getAll | 不跟字段名,表示查詢所有記錄。 | |
支持的關(guān)鍵字 | And | 連接多個查詢條件,相當于 SQL 中的 AND。 |
Or | 連接多個查詢條件,相當于 SQL 中的 OR。 | |
Between | 查詢字段在某個范圍內(nèi)的記錄。 | |
LessThan/LessThanEqual | 查詢字段小于或小于等于某個值的記錄。 | |
GreaterThan/GreaterThanEqual | 查詢字段大于或大于等于某個值的記錄。 | |
IsNull/IsNotNull | 查詢字段為空或不為空的記錄。 | |
Like/NotLike | 模糊查詢字段值。 | |
OrderBy | 指定查詢結(jié)果的排序方式。 | |
刪除方法 | deleteBy/removeBy | 后面跟要查詢的字段名,用于精確匹配。 |
delete/remove | 后面跟要查詢的字段名,使用條件表達式進行模糊匹配。 | |
統(tǒng)計方法 | countBy | 后面跟要查詢的字段名,用于精確匹配。 |
count | 不跟字段名,表示統(tǒng)計所有記錄數(shù)。 | |
更新方法 | updateBy | 后面跟要查詢的字段名,用于精確匹配。 |
update | 后面跟要查詢的字段名,使用條件表達式進行模糊匹配。 | |
支持的關(guān)鍵字 | Set | 設(shè)置要更新的字段的值。 |
Where | 指定更新操作的條件。 |
3.部分查詢關(guān)鍵字映射示例
部分查詢關(guān)鍵字映射示例 | |
關(guān)鍵字 | 使用示例 |
And | findByLastnameAndFirstname |
Or | findByLastnameOrFirstname |
Is,Equals | findByFirstnameIs,findByFirstnameEquals |
Between | findByStartDateBetween |
LessThan | findByAgeLessThan |
LessThanEqual | findByAgeLessThanEqual |
GreaterThan | findByAgeGreaterThan |
GreaterThanEqual | findByAgeGreaterThanEqual |
After | findByStartDateAfter |
Before | findByStartDateBefore |
IsNull | findByAgeIsNull |
IsNotNull,NotNull | findByAge(Is)NotNull |
Like | findByFirstnameLike |
NotLike | findByFirstnameNotLike |
StartingWith | findByFirstnameStartingWith |
EndingWith | findByFirstnameEndingWith |
Containing | findByFirstnameContaining |
OrderBy | findByAgeOrderByLastnameDesc |
Not | findByLastnameNot |
In | findByAgeIn(Collection ages) |
NotIn | findByAgeNotIn(Collection ages) |
TRUE | findByActiveTrue() |
FALSE | findByActiveFalse() |
IgnoreCase | findByFirstnameIgnoreCase |
到此這篇關(guān)于SpringBoot整合JPA 基礎(chǔ)使用的文章就介紹到這了,更多相關(guān)SpringBoot整合JPA 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java ClassCastException報錯:java.util.HashSet cannot
這篇文章主要來帶大家分析一下Java開發(fā)中常見的ClassCastException異常,當試圖將HashSet強制轉(zhuǎn)換為List時會拋出java.util.HashSet cannot be cast to java.util.List,下面我們來看看具體怎么解決吧2026-02-02
BeanUtils.copyProperties復制屬性失敗的原因及解決方案
這篇文章主要介紹了BeanUtils.copyProperties復制屬性失敗的原因及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
springboot讀取.properties配置文件中的map和list類型配置參數(shù)方式
這篇文章主要介紹了springboot讀取.properties配置文件中的map和list類型配置參數(shù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03
JDK源碼之線程并發(fā)協(xié)調(diào)神器CountDownLatch和CyclicBarrier詳解
我一直認為程序是對于現(xiàn)實世界的邏輯描述,而在現(xiàn)實世界中很多事情都需要各方協(xié)調(diào)合作才能完成,就好比完成一個平臺的交付不可能只靠一個人,而需要研發(fā)、測試、產(chǎn)品以及項目經(jīng)理等不同角色人員進行通力合作才能完成最終的交付2022-02-02
SpringBoot集成Druid實現(xiàn)監(jiān)控功能的示例代碼
這篇文章主要介紹了SpringBoot集成Druid實現(xiàn)監(jiān)控功能,Druid是阿里巴巴開發(fā)的號稱為監(jiān)控而生的數(shù)據(jù)庫連接池,可以很好的監(jiān)控DB池連接和SQL的執(zhí)行情況,天生就是針對監(jiān)控而生的DB連接池,文中通過代碼示例講解非常詳細,需要的朋友可以參考下2024-02-02
Spring深入分析講解BeanUtils的實現(xiàn)
java知識體系統(tǒng)有很多數(shù)據(jù)實體,比較常用的DTO、BO、DO、VO等,其他類似POJO概念太老了現(xiàn)在基本廢棄掉了,本篇幅直接忽略,對于這幾種數(shù)據(jù)實體各自代表的含義和應(yīng)用場景先做一下簡單描述和分析2022-06-06
Java中BeanUtils.copyProperties的11個坑總結(jié)
我們?nèi)粘i_發(fā)中,經(jīng)常涉及到DO、DTO、VO對象屬性拷貝賦值,很容易想到org.springframework.beans.BeanUtils的copyProperties,它會自動通過反射機制獲取源對象和目標對象的屬性,pyProperties,會有好幾個坑呢,本文將給大家總結(jié)一下遇到的坑,需要的朋友可以參考下2023-05-05

