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è)應用開發(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還提供了一些高級特性,如緩存管理、事務管理等,這些特性可以幫助開發(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)文章
詳解SpringMVC組件之HandlerMapping(一)
這篇文章主要介紹了詳解SpringMVC組件之HandlerMapping(一),HandlerMapping組件是Spring?MVC核心組件,用來根據(jù)請求的request查找對應的Handler,在Spring?MVC中,有各式各樣的Web請求,每個請求都需要一個對應的Handler來處理,需要的朋友可以參考下2023-08-08java高級用法之綁定CPU的線程Thread?Affinity簡介
java線程thread affinity是用來將java代碼中的線程綁定到CPU特定的核上,用來提升程序運行的性能,這篇文章主要介紹了java高級用法之綁定CPU的線程thread affinity的相關(guān)知識,需要的朋友可以參考下2022-05-05Java8日期類LocalDate、LocalTime和LocalDateTime使用方法詳解
這篇文章主要給大家介紹了關(guān)于Java8日期類LocalDate、LocalTime和LocalDateTime使用方法的相關(guān)資料,LocalDateTime是JDK1.8出現(xiàn)的新特性,解決線程不安全的問題,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2023-11-11Netty之使用DelimiterBasedFrameDecoder進行消息分隔詳解
這篇文章主要介紹了Netty之使用DelimiterBasedFrameDecoder進行消息分隔詳解,在使用Netty進行TCP消息傳輸時,為了上層協(xié)議能夠?qū)ο⒄_區(qū)分,避免粘包和拆包導致的問題,一般可以通過消息定長、將回車換行符作為消息結(jié)束符,需要的朋友可以參考下2023-12-12IDEA?2021.3?使用及idea2021.3.1激活使用方法
IDEA?全稱?IntelliJ?IDEA,是java語言開發(fā)的集成環(huán)境,IntelliJ在業(yè)界被公認為最好的java開發(fā)工具之一,今天通過本文給大家介紹idea2021.3.1激活及使用教程,感興趣的朋友一起看看吧2022-01-01微服務?Spring?Boot?整合?Redis?BitMap?實現(xiàn)?簽到與統(tǒng)計功能
這篇文章主要介紹了微服務?Spring?Boot?整合?Redis?BitMap?實現(xiàn)?簽到與統(tǒng)計功能,文章簡單介紹了Redis BitMap 基本用法結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-01-01