SpringBoot整合JPA框架實(shí)現(xiàn)過(guò)程講解
一. Spring Boot數(shù)據(jù)訪問(wèn)概述
Spring Data是Spring提供的一個(gè)用于簡(jiǎn)化數(shù)據(jù)庫(kù)訪問(wèn)、支持云服務(wù)的開(kāi)源框架。它是一個(gè)傘形項(xiàng)目,包含了大量關(guān)系型數(shù)據(jù)庫(kù)及非關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)訪問(wèn)解決方案,其設(shè)計(jì)目的是使我們可以快速且簡(jiǎn)單地使用各種數(shù)據(jù)訪問(wèn)技術(shù)。Spring Boot默認(rèn)采用整合Spring Data的方式統(tǒng)一處理數(shù)據(jù)訪問(wèn)層,通過(guò)添加大量自動(dòng)配置,引入各種數(shù)據(jù)訪問(wèn)模板xxxTemplate以及統(tǒng)一的Repository接口,從而達(dá)到簡(jiǎn)化數(shù)據(jù)訪問(wèn)層的操作。
Spring Data提供了多種類型數(shù)據(jù)庫(kù)支持,Spring Boot對(duì)Spring Data支持的數(shù)據(jù)庫(kù)進(jìn)行了整合管理,提供了各種依賴啟動(dòng)器。通過(guò)一張表羅列Spring Boot提供的常見(jiàn)數(shù)據(jù)庫(kù)依賴啟動(dòng)器。
名稱 | 描述 |
mybatis-spring-boot-starter | MyBatis啟動(dòng)器 |
mybatis-plus-boot-starter | MyBatis-Plus啟動(dòng)器 |
spring-boot-starter-data-jpa | Spring Data JPA與Hibernate的啟動(dòng)器 |
spring- boot starter-data-redis | Redis鍵值數(shù)據(jù)存儲(chǔ)與Spring Data Redis和Jedis客戶端的啟動(dòng)器 |
spring-boot-starter-data-neo4j | Neo4j圖數(shù)據(jù)庫(kù)和Spring Data Neo4j的啟動(dòng)器 |
spring-boot-starter-data-mongodb | MongoDB和Spring Data MongoDB的啟動(dòng)器 |
二. Spring Data JPA簡(jiǎn)介
JPA(Java Persistence API,Java持久化API )是Sun公司官方提出的Java持久化規(guī)范,它為Java開(kāi)發(fā)人員提供了一種對(duì)象/關(guān)系映射的工具管理Java中的關(guān)系型數(shù)據(jù),其主要目的是簡(jiǎn)化現(xiàn)有的持久化開(kāi)發(fā)工作和整合ORM(Object Relational Mapping,對(duì)象/關(guān)系映射)技術(shù)。Spring Data在JPA規(guī)范的基礎(chǔ)上,充分利用其優(yōu)點(diǎn),提出了Spring Data JPA模塊對(duì)具有ORM關(guān)系數(shù)據(jù)進(jìn)行持久化操作。
Spring Data JPA是Spring在ORM框架、JPA規(guī)范的基礎(chǔ)上封裝的一套JPA應(yīng)用框架,提供了增刪改查等常用功能,使開(kāi)發(fā)者可以用較少的代碼實(shí)現(xiàn)數(shù)據(jù)操作,同時(shí)還易于擴(kuò)展。在介紹Spring Boot整合JPA之前,先針對(duì)Spring Data JPA的基本使用進(jìn)行簡(jiǎn)單介紹。
2.1 編寫(xiě)ORM實(shí)體類
Spring Data JPA框架是針對(duì)具有ORM關(guān)系的數(shù)據(jù)進(jìn)行操作,所以在使用Spring Data JPA時(shí),首先需要編寫(xiě)一個(gè)實(shí)體類與數(shù)據(jù)表進(jìn)行映射,并且配置好映射關(guān)系。
@Entity(name = "t_comment") // 設(shè)置ORM實(shí)體類,并指定映射的表名 public class Discuss { @Id // 表明映射對(duì)應(yīng)的主鍵id @GeneratedValue(strategy = GenerationType.IDENTITY) // 設(shè)置主鍵自增策略 @Column(name = "article_id") // 指定映射的表字段名 private Integer articleId; // Generate: Getter and Setter、toString() }
針對(duì)上述代碼,壹哥把用到的注解給大家進(jìn)行簡(jiǎn)要說(shuō)明。
@Entity:標(biāo)注要與數(shù)據(jù)庫(kù)做映射的實(shí)體類,默認(rèn)情況下,數(shù)據(jù)表的名稱就是首字母小寫(xiě)的類名。當(dāng)然,還可以使用name屬性指定映射的表名。
@ld:標(biāo)注在類屬性或者getter方法上,表示某一個(gè)屬性對(duì)應(yīng)表中的主鍵。
@GeneratedValue:與@ld注解標(biāo)注在同一位置,用于表示屬性對(duì)應(yīng)主鍵的生成策略,可省略。Spring Data JPA支持的主鍵生成策略包括有TABLE(使用一個(gè)特定的數(shù)據(jù)庫(kù)表格來(lái)保存主鍵)、SEQUENCE(不支持主鍵自增長(zhǎng)的數(shù)據(jù)庫(kù)主鍵生成策略)、IDENTITY(主鍵自增)和AUTO(JPA自主選擇前面3種合適的策略,是默認(rèn)選項(xiàng))。
@Column:標(biāo)注在屬性上,當(dāng)類屬性與表字段名不同時(shí),能夠配合name屬性表示類屬性對(duì)應(yīng)的表字段名。
2.2 編寫(xiě)Repository接口
針對(duì)不同的表數(shù)據(jù)操作編寫(xiě)各自對(duì)應(yīng)的Repository接口,并根據(jù)需要編寫(xiě)對(duì)應(yīng)的數(shù)據(jù)操作方法。
public interface DiscussRepository extends JpaRepository<Discuss, Integer> { // 1.查詢author非空的Discuss評(píng)論集合(JPA支持的方法名關(guān)鍵字查詢方式) List<Discuss> findByAuthorNotNull(); // 2.根據(jù)文章id分頁(yè)查詢Discuss評(píng)論集合 @Query("SELECT c FROM t_comment c WHERE c.articleId = ?1") List<Discuss> getDiscussPaged(Integer articleid, Pageable pageable); // 3.使用元素SQL語(yǔ)句,根據(jù)文章id分頁(yè)查詢Discuss評(píng)論集合,nativeQuery為true表示用來(lái)編寫(xiě)原生SQL語(yǔ)句 @Query(value = "SELECT * FROM t_comment WHERE article_Id = ?1", nativeQuery = true) List<Discuss> getDiscussPaged2(Integer articleid, Pageable pageable); //4.根據(jù)評(píng)論id修改評(píng)論作者author @Transactional // 表示支持事務(wù)管理 @Modifying // 表示支持?jǐn)?shù)據(jù)變更 @Query("UPDATE t_comment c SET c.author = ?1 WHERE c.id = ?2") Integer updateDiscuss(String author, Integer id); // 5.根據(jù)評(píng)論id刪除評(píng)論 @Transactional @Modifying @Query("DELETE t_comment c WHERE c.id = ?1") Integer deleteDiscuss(Integer id); }
針對(duì)Repository接口編寫(xiě)時(shí)的特殊要求,壹哥給大家解釋一下。
2.2.1 繼承XXRepository<T, ID>接口
我們?cè)谑褂肧pring Data JPA自定義Repository接口時(shí),必須繼承XXRepository<T, ID>
接口,其中的T代表要操作的實(shí)體類,ID代表實(shí)體類主鍵數(shù)據(jù)類型。在上述示例中,選擇繼承了JpaRepository接口,JpaRepository的繼承結(jié)構(gòu)如下圖所示。
下面對(duì)JpaRepository接口繼承結(jié)構(gòu)中涉及的接口進(jìn)行說(shuō)明,具體如下。
(1) Repository是Spring Data JPA提供的用于自定義Repository接口的頂級(jí)父接口,該接口中沒(méi)有聲明任何方法。
(2) CrudRepository接口是Repository的繼承接口之一,包含了一些基本的CRUD方法。
(3) PagingAndSortingRepository接口繼承CrudRepository接口的同時(shí),提供了分頁(yè)和排序兩個(gè)方法。
(4) QueryByExampleExecutor接口是進(jìn)行條件封裝查詢的頂級(jí)父接口,允許通過(guò)Example實(shí)例執(zhí)行復(fù)雜條件查詢。
JpaRepository接口同時(shí)繼承了PagingAndSortingRepository接口和QueryByExampleExecutor接口,并額外提供了一些數(shù)據(jù)操作方法。自定義Repository接口文件時(shí),通常會(huì)直接選擇繼承JpaRepository接口。
2.2.2 操作數(shù)據(jù)的多種方式
在使用Spring Data JPA進(jìn)行數(shù)據(jù)操作時(shí),可以有多種實(shí)現(xiàn)方式,主要方式如下。
(1).如果自定義接口繼承了JpaRepository接口,則默認(rèn)包含了一些常用的CRUD方法。
(2).自定義Repository接口中,可以使用@Query注解配合SQL語(yǔ)句進(jìn)行數(shù)據(jù)的查、改、刪操作。
(3).自定義Repository接口中,可以直接使用方法名關(guān)鍵字進(jìn)行查詢操作。
其中,Spring Data JPA中支持的方法名關(guān)鍵字及對(duì)應(yīng)的SQL片段說(shuō)明,如下表所示。
2.2.3 @Transactional事務(wù)管理
在自定義的Repository接口中,針對(duì)數(shù)據(jù)的變更操作(修改、刪除),無(wú)論是否使用了@Query注解,都必須在方法上方添加@Transactional注解進(jìn)行事務(wù)管理,否則程序執(zhí)行就會(huì)出現(xiàn)InvalidDataAccessApiUsageException異常。如果在調(diào)用Repository接口方法的業(yè)務(wù)層Service類上已經(jīng)添加了@Transactional注解進(jìn)行事務(wù)管理,那么Repository接口文件中就可以省略@Transactional注解。
2.2.4 @Moditying注解
在自定義的Repository接口中,使用@Query注解方式執(zhí)行數(shù)據(jù)變更操作(修改、刪除),除了要使用@Query注解,還必須添加@Moditying注解表示數(shù)據(jù)變更。
2.3.5 復(fù)雜條件查詢
JPA還支持使用Example實(shí)例進(jìn)行復(fù)雜條件查詢。例如,針對(duì)JpaRepository接口中已存在的findAll(Example<S> var1)
方法進(jìn)行查詢。
三. 使用Spring Boot整合JPA
使用Spring Boot整合JPA,具體步驟如下。
3.1 添加Spring Data JPA依賴啟動(dòng)器
在項(xiàng)目的pom.xml文件中添加Spring Data JPA依賴啟動(dòng)器。
注意:
我們并沒(méi)有編寫(xiě)Spring Data JPA對(duì)應(yīng)的版本號(hào),這是因?yàn)镾pring Boot對(duì)Spring Data JPA的版本號(hào)進(jìn)行了統(tǒng)一管理。
3.2 編寫(xiě)ORM實(shí)體類
為了方便操作,以之前創(chuàng)建的數(shù)據(jù)庫(kù)表t_comment為例編寫(xiě)對(duì)應(yīng)的實(shí)體類,將之前創(chuàng)建的Comment類復(fù)制一份并重命名為Discuss,同時(shí)添加JPA對(duì)應(yīng)的注解進(jìn)行映射配置。
3.3 編寫(xiě)Repository接口
在com.cy.repository包下創(chuàng)建一個(gè)用于對(duì)數(shù)據(jù)庫(kù)表t_comment進(jìn)行操作的Repository接口DiscussRepository。
3.4 編寫(xiě)單元測(cè)試進(jìn)行接口方法測(cè)試
將Chapter03ApplcationTests測(cè)試類在當(dāng)前位置復(fù)制一份并重命名為JpaTests,用來(lái)編寫(xiě)JPA相關(guān)的單元測(cè)試,并對(duì)內(nèi)容稍微修改后編寫(xiě)DiscussRepository接口對(duì)應(yīng)的測(cè)試方法。
測(cè)試方法中分別使用了JpaRepository默認(rèn)方法、方法名關(guān)鍵字、@Query注解和Example封裝參數(shù)的形式進(jìn)行了數(shù)據(jù)操作。
3.5 整合測(cè)試
選擇JpaTests測(cè)試類中單元測(cè)試方法進(jìn)行效果的演示。
以上就是SpringBoot中整合JPA框架的過(guò)程,你學(xué)會(huì)了嗎?如果還有其他疑問(wèn),可以在評(píng)論區(qū)留言哦。
到此這篇關(guān)于SpringBoot整合JPA框架實(shí)現(xiàn)過(guò)程講解的文章就介紹到這了,更多相關(guān)SpringBoot整合JPA內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis-plus中BaseMapper入門(mén)使用
本文主要介紹了mybatis-plus中BaseMapper入門(mén)使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08Java并發(fā)編程深入理解之Synchronized的使用及底層原理詳解 上
在并發(fā)編程中存在線程安全問(wèn)題,主要原因有:1.存在共享數(shù)據(jù) 2.多線程共同操作共享數(shù)據(jù)。關(guān)鍵字synchronized可以保證在同一時(shí)刻,只有一個(gè)線程可以執(zhí)行某個(gè)方法或某個(gè)代碼塊,同時(shí)synchronized可以保證一個(gè)線程的變化可見(jiàn)(可見(jiàn)性),即可以代替volatile2021-09-09Java裝飾器設(shè)計(jì)模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java裝飾器設(shè)計(jì)模式的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05Maven中exec插件執(zhí)行Java程序的實(shí)現(xiàn)
在Maven項(xiàng)目中,可以使用Maven的插件來(lái)執(zhí)行Java程序,本文主要介紹了Maven中exec插件執(zhí)行Java程序的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12mybatis使用foreach查詢不出結(jié)果也不報(bào)錯(cuò)的問(wèn)題
這篇文章主要介紹了mybatis使用foreach查詢不出結(jié)果也不報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Java selenium截圖操作的實(shí)現(xiàn)
這篇文章主要介紹了Java selenium截圖操作的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08java判斷integer是否為空的詳細(xì)過(guò)程
在java編寫(xiě)過(guò)程中,我們會(huì)使用到各種各樣的表達(dá)式,在使用表達(dá)式的過(guò)程中,有哪些安全問(wèn)題需要我們注意的呢?對(duì)java判斷integer是否為空相關(guān)知識(shí)感興趣的朋友一起來(lái)看看吧2023-02-02淺談springMVC接收前端json數(shù)據(jù)的總結(jié)
下面小編就為大家分享一篇淺談springMVC接收前端json數(shù)據(jù)的總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03Java實(shí)現(xiàn)連接kubernates集群的兩種方式詳解
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)連接kubernates集群的兩種方式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01