国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

新鮮速遞:Spring Data JPA 3.0快速入門、進階到精通

這篇具有很好參考價值的文章主要介紹了新鮮速遞:Spring Data JPA 3.0快速入門、進階到精通。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

第一章、安裝Spring Data JPA

第一步,先確保你使用的是Spring Boot 3.0或以上環(huán)境,可以在pom.xml里加入Spring Data JPA依賴

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

第二步,配置你的Spring Data JPA,這里一定要有一個可以連接的數(shù)據(jù)庫,這里以MySQL為例

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: "jdbc:mysql://127.0.0.1:3306/數(shù)據(jù)庫名?useUnicode=true&characterEncoding=utf8&reWriteBatchedInserts=true&autoReconnect=true&maxReconnects=2&initialTimeout=5"
    username: 用戶名
    password: 密碼
  jpa:
    database: MySQL
    show-sql: true
    generate-ddl: true
    hibernate:
      ddl-auto: none

至此安裝完成

第二章、常規(guī)用法

首先我們要知道Spring Data JPA的作用,Spring Data JPA是一種基于JPA技術(shù)的ORM框架封裝,相當于把EclipseLink或Hibernate加了一層殼,所以本質(zhì)上你調(diào)用的還是Hibernate。
根據(jù)JPA的規(guī)范,我們要進行讀寫數(shù)據(jù)庫,靠的是對實體(Entity)的定義,每一個實體都對應(yīng)了一張表,這一點上并不是JPA的獨創(chuàng),大多數(shù)ORM框架都是這么做的,這么想就很容易理解了。
在進行實體操作的時候,傳統(tǒng)方式是通過DAO(數(shù)據(jù)訪問對象)進行操作,但到了JPA,你其實不必定義DAO,使用實體管理器即可進行實體操作和查詢,用于取代DAO的則是Repository(倉庫)。

第一步,我們定義一個實體,為了省略Getter和Setter方法,這里使用了Lombok的@Data注解:

import jakarta.persistence.*;
import lombok.Data;

@Entity
@Table(name = "student")
@Data
public class Student {
    @Id
    @Column(name = "uuid")
    @GeneratedValue(strategy = GenerationType.UUID)
    private String uuid;

    @Column(name = "name")
    private String name;

    @Column(name = "age")
    private Integer age;
}

這里需要注意的是,對于日期類的字段,請加上@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")注解,否則很多情況下你的時間格式是不統(tǒng)一的,這里的GMT+8指的就是東八區(qū)時區(qū),如果你做外貿(mào)系統(tǒng),需要根據(jù)實際情況調(diào)整。

第二步,寫Repository,泛型第一個是實體類,第二個是主鍵類型,這里主鍵用的是UUID,所以是String

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface StudentRepository extends CrudRepository<Student,String> {
    Student getStudentByUuid(String uuid);
}

這里不用給出任何具體實現(xiàn),因為實現(xiàn)都是由Spring Data JPA自動為你寫好的,只需要按規(guī)則把方法名寫好即可,一般都是用find、get、delete開頭,IDE會自動幫你提示出方法名。
新鮮速遞:Spring Data JPA 3.0快速入門、進階到精通
這里你可以讓接口繼承RepositoryCrudRepositoryJpaRepository

無論是你想控制邊界避免程序員隨意調(diào)用未經(jīng)許可的接口方法,還是想手動優(yōu)化,讓所有的方法都要自己定義,請使用Repository。
如果你想做一些簡單的增刪改查,請使用CrudRepository。
如果想要分頁、多條件查詢等常規(guī)功能,請使用JpaRepository。
其中JpaRepository是功能最為強大的,但也同時是可優(yōu)化程度最低的,適用于小型項目。

第三步,注入到Controller或者Service層里,調(diào)用即可

import jakarta.annotation.Resource;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/student")
@Transactional(rollbackFor = Exception.class)
public class StudentController {
    @Resource
    StudentRepository studentRepository;

    @GetMapping("/get")
    public Student get(String uuid){
        return studentRepository.getStudentByUuid(uuid);
    }
}

至于常規(guī)的增刪改查直接就自帶了,直接用即可
新鮮速遞:Spring Data JPA 3.0快速入門、進階到精通
新鮮速遞:Spring Data JPA 3.0快速入門、進階到精通
新鮮速遞:Spring Data JPA 3.0快速入門、進階到精通

第三章、進階用法

如果你實際做項目,并不是只需要這點增刪改查就可以的,做做畢業(yè)設(shè)計也就罷了。我們需要的是對SQL語句的整體把控,能夠進行手動優(yōu)化,甚至封裝框架。

在Repository中自定義JPQL或SQL查詢

是不是做項目的時候發(fā)現(xiàn)Repository方法名寫的太長了,可讀性非常差呢?這里我們可以在方法上加上@Query注解,例如:

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface MaterialRepository extends CrudRepository<Material,String> {
    @Query(value = "select * from material where enabled = ?1",nativeQuery = true)
    List<Material> queryValidMaterial(Boolean enabled);
}

這里的nativeQuery如果是true,用的是SQL查詢,如果是false,用的就是JPQL查詢。而enabled就是咱們自己定義的參數(shù),Material是實際業(yè)務(wù)系統(tǒng)中物料表的表名。
而value中所寫的?1代表第一個參數(shù),以此列推?2就代表第二個參數(shù),如果你覺得這么寫在長語句中不太直觀,那也可以將占位符改為:enabled這樣的形式,比如:

    @Query(value = "select * from material where enabled = :enabled",nativeQuery = true)
    List<Material> queryValidMaterial(@Param("enabled") Boolean enabled);

使用EntityManager直接進行查詢

EntityManager是JPA中的實體管理器,它的實例是與線程相關(guān)的,所以可以很方便的在Spring管理的任何地方進行查詢。簡單的來說,我們可以用EntityManager來替代Repository,這對于要自己封裝框架的讀者們會非常友好。
下面這個例子就是使用EntityManager進行SQL查詢并返回結(jié)果的例子:

@RestController
@RequestMapping("/api/material")
@Transactional(rollbackFor = Exception.class)
public class MaterialController {
    @PersistenceContext
    EntityManager entityManager;

    @GetMapping("/get")
    public Material get(String uuid){
    	// 創(chuàng)建SQL查詢,第一個參數(shù)是SQL,第二個參數(shù)是要自動ORM的實體
        Query query = entityManager
                .createNativeQuery("""
                    SELECT * FROM material
                    WHERE uuid = :uuid
                """,Material.class);
        // 設(shè)置預(yù)編譯參數(shù),如果是?1、?2或者直接?做占位符的,第一個參數(shù)應(yīng)當為從1開始的數(shù)字
        query.setParameter("uuid",uuid);
        // 獲取一個結(jié)果并返回,如果需要多個結(jié)果,則調(diào)用getResultList()
        Material result = (Material)query.getSingleResult();
        return result;
    }
}

這里如果直接使用createQuery方法,則表明使用JPQL。因為很多人是MyBatis Plus轉(zhuǎn)的,所以這里就用NativeQuery的寫法,比較容易被讀者接受。EntityManager可以說是JPA的核心,很多有趣的用法大家可以自行探索一下。

結(jié)合Spring Security自動寫入審計信息

我們經(jīng)常需要讓系統(tǒng)自動維護創(chuàng)建人、創(chuàng)建時間、最后修改人、最后修改時間等信息,如果反復(fù)寫這些代碼會比較麻煩,最好的做法是讓框架直接替咱們寫進去。
第一步,創(chuàng)建自動審計信息寫入的配置

import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.AuditorAware;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;

import java.util.Optional;

@Configuration
public class JpaAutoAuditor implements AuditorAware<String> {

    @Override
    public Optional<String> getCurrentAuditor() {
        SecurityContext context = SecurityContextHolder.getContext();
        if (context == null) return Optional.of("");
        Authentication authentication = context.getAuthentication();
        if (authentication == null) return Optional.of("");
        if (!authentication.isAuthenticated()) return Optional.of("");
        return Optional.of(authentication.getName());
    }
}

第二步,我們同步在實體類(Entity)里創(chuàng)建對應(yīng)的審計字段

    /**
     * 創(chuàng)建人
     */
    @CreatedBy
    @Column(name = "create_by")
    private String createBy

    /**
     * 創(chuàng)建時間
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @CreatedDate
    @Column(name = "create_time")
    private LocalDateTime createTime

    /**
     * 最后修改人
     */
    @LastModifiedBy
    @Column(name = "last_modified_by")
    private String lastModifiedBy

    /**
     * 最后修改時間
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @LastModifiedDate
    @Column(name = "last_modified_time")
    private LocalDateTime lastModifiedTime

這樣便可以在保存和更新的時候自動填充時間和創(chuàng)建人、修改人了。注意JsonFormat引用的是com.fasterxml.jackson.annotation.JsonFormat。

分頁

其實分頁這塊雖然叫做進階用法,但是大多數(shù)情況還是根據(jù)實際業(yè)務(wù)來判斷如何分頁的。
如果你用Repository的方式,可以按如下方式進行分頁

	@Query(value = "SELECT * FROM material WHERE type = ?1",
	 countQuery = "SELECT count(1) FROM material WHERE type = ?1",
	 nativeQuery = true)
	Page<Material> findByType(Integer type, Pageable pageable);

這里的countQuery是用來確定總數(shù)量的SQL語句,調(diào)用的時候pageable這么傳:PageRequest.of(1,20),就代表取第一頁的數(shù)據(jù),每頁20條

當然,如果因為查詢效率不想用這個特性(比如跨庫查詢時往往會自定義一個KV庫做查詢堆),也可以手動寫limit或rowno查詢子句。

事務(wù)控制

上面的例子里大家會看到@Transactional注解,這個注解所標注的類或方法就會開啟事務(wù)特性。如果你使用org.springframework.transaction.annotation.Transactional而不是jakarta的Transactional注解,還可以定制rollBackFor屬性,當發(fā)生特定異常時才會進行回滾操作。

但有時候我們可能會做個EventBus封裝一些消息,當執(zhí)行過程到達某些錯誤消息的時候應(yīng)當使之前所做的處理都恢復(fù)到原狀,或者我們需要更加精細化的事務(wù)控制,這時候就會用到手動回滾。

// 無論在哪里執(zhí)行,回滾當前線程下的事務(wù)(但不會立即回滾)
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
// 用EntityManager開啟事務(wù)
entityManager.getTransaction().begin();
// 用EntityManager提交事務(wù)
entityManager.getTransaction().commit();
// 用EntityManager回滾事務(wù)
entityManager.getTransaction().rollback();
// 用EntityManager標記為應(yīng)當回滾
entityManager.getTransaction().setRollbackOnly();

這里會涉及到事務(wù)傳播機制,想必大家之前應(yīng)該都學(xué)習(xí)過這個內(nèi)容。

其他用法

有興趣的讀者可以搜索以下進階用法,難度都不是很大,展開的去講會比較跑題,所以這里不做贅述,短時間內(nèi)突破即可快速全面掌握Spring Data JPA的用法:

1. Spring Data JPA 配置 Druid數(shù)據(jù)源
2. Spring Data JPA 的查詢緩存配置
3. Hibernate的三態(tài)變化
4. Spring Data JPA + JTA(Atomikos)做分布式事務(wù)
5. Spring Data JPA 多數(shù)據(jù)源

有興趣的讀者可以自行研究、寫博客并告訴我,我會在這里附上鏈接。

第四章、精通領(lǐng)域

前面的知識已經(jīng)足夠可以覆蓋你的日常業(yè)務(wù),如非必要,這一章可以略過,研究這一章的內(nèi)容會消耗大量時間和精力。

Spring Data JPA內(nèi)部機制

Jpa的抽象適配器位于AbstractJpaVendorAdapter,其實現(xiàn)有兩個,一個是EclipseLinkJpaVendorAdapter,另一個是HibernateJpaVendorAdapter
在啟動時會通過getJpaPropertyMap方法構(gòu)筑配置項。

由此EntityManagerFactory和EntityManager會被構(gòu)建起來。在這個過程中,SpringHibernateJpaPersistenceProvider會提供其實現(xiàn)。實現(xiàn)將被定位到Hibernate的SessionFactoryImpl和SessionImpl。

所以當我們每次調(diào)用EntityManager實際上調(diào)用的是Hibernate的Session。

除此之外,Repository的實現(xiàn)是SimpleJpaRepository,你的各種自定義方法實現(xiàn)都是基于JdkDynamicAopProxy的動態(tài)代理。

Criteria查詢

你可以利用Criteria查詢可以將大多數(shù)的查詢機制進行二次封裝,而且借助JPQL的特性,與具體數(shù)據(jù)庫方言無關(guān)。如果你希望做一款能支持多種數(shù)據(jù)庫系統(tǒng)的BI,Criteria可能會是一個不錯的選擇。
例如剛才查詢學(xué)生UUID的過程就可以這樣寫:

        CriteriaBuilder builder = entityManager.getCriteriaBuilder();
        CriteriaQuery<Student> query = builder.createQuery(Student.class);

        Root<Student> root = query.from(Student.class);

        query.where(builder.and(
                builder.equal(root.get("uuid"), uuid)
        ));

        return entityManager.createQuery(query).getSingleResult();

使用該工具可以很方便的實現(xiàn)數(shù)據(jù)湖、BI等產(chǎn)品

GraphQL

當你使用Spring Data JPA之后就可以無縫使用GraphQL了。
第一步,引入spring-boot-starter-graphql
第二步,開啟GraphQL

spring
	graphql
		graphiql
			enabled:true

第三步,Spring Boot會在src/main/resources/graphql/**目錄尋找結(jié)尾為.graphqls.gqls的文件,這些文件里可以這樣描述我們的GraphQL查詢結(jié)構(gòu):

type Student {
    uuid: ID!
    name: String!
    age: Int
}
type Query {
    allStudents: [Student]!
    studentByUuid(uuid: ID): Student
}
type Mutation {
    createStudent(studentInput: StudentInput): Student
}
input StudentInput {
    uuid: ID!
    name: String!
    age: Int
}

第四步,在Controller的方法上標注@QueryMapping注解、在參數(shù)上標注@Argument就可以執(zhí)行查詢了。如果是增刪改操作,則加上@MutationMapping注解即可。

第五章、總結(jié)

為了能最大限度的讓讀者開箱即用Spring Data JPA,這里有很多細節(jié)問題沒有展開的去說,大多數(shù)的專業(yè)術(shù)語已經(jīng)在文中給出提示。
總的來說,Spring Data JPA是一個非常不錯的持久化層框架,以漸進式的方式可以幫助我們快速搭建應(yīng)用到深度使用。隨著多行字符串語法糖的普及,很多SQL語句都可以直接寫在Java文件中,相較于MyBatis寫在XML的做法而言,一來更容易保護我們的知識產(chǎn)權(quán),二來更可以避免因為服務(wù)器被黑客提權(quán)從而修改XML進行二次攻擊的風(fēng)險,第三還可以以一種與數(shù)據(jù)庫方言無關(guān)的方式完成跨數(shù)據(jù)庫平臺的應(yīng)用系統(tǒng)設(shè)計。文章來源地址http://www.zghlxwxcb.cn/news/detail-404191.html

到了這里,關(guān)于新鮮速遞:Spring Data JPA 3.0快速入門、進階到精通的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Spring Data JPA的@Entity注解

    ?rulesCouponTypeConverter.java ?entity/CouponTemplate.java Spring JPA 包的標準注解,對數(shù)據(jù)庫字段進行了映射,我挑幾個關(guān)鍵注解說道一下。 1、Entity:聲明了“數(shù)據(jù)庫實體”對象,它是數(shù)據(jù)庫 Table 在程序中的映射對象; 2、Table:指定了 CouponTemplate 對應(yīng)的數(shù)據(jù)庫表的名稱; 3、ID/Generat

    2024年02月11日
    瀏覽(26)
  • Springboot --- 整合spring-data-jpa和spring-data-elasticsearch

    Springboot --- 整合spring-data-jpa和spring-data-elasticsearch

    SpringBoot: 整合Ldap. SpringBoot: 整合Spring Data JPA. SpringBoot: 整合Elasticsearch. SpringBoot: 整合spring-data-jpa和spring-data-elasticsearch. SpringBoot: 整合thymeleaf. SpringBoot: 注入第三方j(luò)ar包. SpringBoot: 整合Redis. SpringBoot: 整合slf4j打印日志. SpringBoot: 整合定時任務(wù),自動執(zhí)行方法. SpringBoot: 配置多數(shù)據(jù)源

    2023年04月25日
    瀏覽(30)
  • Spring Boot 篇四: Spring Data JPA使用SQL Server

    Spring Boot 篇四: Spring Data JPA使用SQL Server

    本篇介紹篇一至篇三中用到的JPA鏈接SQL Server的具體情況以及實戰(zhàn)過程中可能遇到的問題。 具體的下載和安裝教程,請參閱微軟SQL Server官網(wǎng); SQL Server Express 是免費的,并且配套的SQL Server Management Studio也是可以用的。 呃,當然,使用Docker來運行SQL Server是另外一條路徑。具體

    2024年02月05日
    瀏覽(17)
  • Spring Boot進階(97):從入門到精通:Spring Boot整合Kubernetes詳細教程

    Spring Boot進階(97):從入門到精通:Spring Boot整合Kubernetes詳細教程

    ??隨著云計算和容器化技術(shù)的發(fā)展,Kubernetes已經(jīng)成為了當今最為流行的容器編排平臺之一。而Spring Boot則是Java領(lǐng)域中最為流行的Web應(yīng)用開發(fā)框架之一。將兩者結(jié)合起來,可以幫助開發(fā)者更加高效地構(gòu)建、部署和管理基于Spring Boot的應(yīng)用程序。 ??本文將介紹如何在Spring B

    2024年02月06日
    瀏覽(28)
  • 如何使用Spring Data JPA簡化MySQL數(shù)據(jù)訪問

    本篇文章是 “一起學(xué)習(xí)mysql” 系列的第五篇文章,本篇文章我們學(xué)習(xí)一下Spring Data JPA的使用,在開始學(xué)習(xí)器,我們先來了解一下什么是JPA。 JPA的全稱是Java Persistence API,是J2EE中的一條規(guī)范,它標準化了數(shù)據(jù)持久化API。在上一篇文章中,我們了解了如何使用MyBatis進行MySQL數(shù)據(jù)

    2024年02月15日
    瀏覽(28)
  • Spring Data JPA之自動創(chuàng)建數(shù)據(jù)庫表

    Spring Data JPA之自動創(chuàng)建數(shù)據(jù)庫表

    由于在項目中使用到了Spring Data JPA(Java Persistent API)進行項目開發(fā),并且自己對JPA比較感興趣想進行學(xué)習(xí)和了解。首先學(xué)習(xí)和了解的是JPA自動創(chuàng)建數(shù)據(jù)庫表,通過JPA能夠讓軟件工程師們不用再去手動創(chuàng)建數(shù)據(jù)表,能夠減輕軟件工程師們的工作量。 通過本篇博客可以實現(xiàn)使用

    2024年02月05日
    瀏覽(28)
  • 【單元測試】Spring Data JPA + H2 測試DAO層

    Springboot 2.7.8 h2 2.1.214 引入springboot parent pom 點擊查看代碼 引入junit , springboot-test, spring-data-jpa, H2 點擊查看代碼 H2是一款內(nèi)存數(shù)據(jù)庫,可以配合單測測試數(shù)據(jù)層。實現(xiàn)原理是將依賴的三方數(shù)據(jù)庫通過內(nèi)存的方式進行mock。其中H2數(shù)據(jù)庫的數(shù)據(jù)表結(jié)構(gòu)以及數(shù)據(jù)可以通過sql腳本文件初

    2024年02月07日
    瀏覽(31)
  • 【自我提升】Spring Data JPA之Specification動態(tài)查詢詳解

    【自我提升】Spring Data JPA之Specification動態(tài)查詢詳解

    寫在前面:刷完Spring Data JPA的課后,發(fā)現(xiàn)Specification動態(tài)查詢還挺有意思的,還應(yīng)用到了規(guī)約設(shè)計模式,在此記錄下學(xué)習(xí)過程和見解。 目錄 一、應(yīng)用場景 二、源碼解析 三、規(guī)約模式 四、實際應(yīng)用 1. 簡介 ????????有時我們在查詢某個實體的時候,給定的條件是不固定的,

    2024年02月07日
    瀏覽(21)
  • 【Spring Boot】SpringBoot和數(shù)據(jù)庫交互: 使用Spring Data JPA

    在現(xiàn)代應(yīng)用程序的開發(fā)中,數(shù)據(jù)是核心部分。為了能夠持久化、檢索、更新和刪除數(shù)據(jù),應(yīng)用程序需要與數(shù)據(jù)庫進行交互。 1.1 為什么需要數(shù)據(jù)庫交互 數(shù)據(jù)持久化 :當你關(guān)閉應(yīng)用程序或者服務(wù)器時,你仍希望數(shù)據(jù)能夠保存。數(shù)據(jù)庫提供了一個持久的存儲方案,使得數(shù)據(jù)在關(guān)閉

    2024年02月12日
    瀏覽(29)
  • Jpa與Druid線程池及Spring Boot整合(一): spring-boot-starter-data-jpa 搭建持久層

    Jpa與Druid線程池及Spring Boot整合(一): spring-boot-starter-data-jpa 搭建持久層

    ? ? ? ? ? ? ? ? ? ? ? Jpa與Druid線程池及Spring Boot整合(一) Jpa與Druid線程池及Spring Boot整合(二):幾個坑 附錄官網(wǎng)文檔:core.domain-events域事件 docker實戰(zhàn)(一):centos7 yum安裝docker docker實戰(zhàn)(二):基礎(chǔ)命令篇 docker實戰(zhàn)(三):docker網(wǎng)絡(luò)模式(超詳細) docker實戰(zhàn)(四):docker架構(gòu)原理 docker實戰(zhàn)(五

    2024年02月13日
    瀏覽(34)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包