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

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

