欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

jpa介紹以及在spring boot中使用詳解

 更新時間:2021年08月10日 16:51:34   作者:深存少年夢  
最近在項目中使用了一下jpa,發(fā)現還是挺好用的。這里就來講一下jpa以及在spring boot中的使用。在這里我們先來了解一下jpa,希望能給你帶來幫助

1.什么是jpa呢?

JPA顧名思義就是Java Persistence API的意思,是JDK 5.0注解或XML描述對象-關系表的映射關系,并將運行期的實體對象持久化到數據庫中。

2.jpa具有什么優(yōu)勢?

2.1標準化

JPA 是 JCP 組織發(fā)布的 Java EE 標準之一,因此任何聲稱符合 JPA 標準的框架都遵循同樣的架構,提供相同的訪問API,這保證了基于JPA開發(fā)的企業(yè)應用能夠經過少量的修改就能夠在不同的JPA框架下運行。

2.2容器級特性的支持

JPA框架中支持大數據集、事務、并發(fā)等容器級事務,這使得 JPA 超越了簡單持久化框架的局限,在企業(yè)應用發(fā)揮更大的作用。

2.3簡單方便

JPA的主要目標之一就是提供更加簡單的編程模型:在JPA框架下創(chuàng)建實體和創(chuàng)建Java 類一樣簡單,沒有任何的約束和限制,只需要使用 javax.persistence.Entity進行注釋,JPA的框架和接口也都非常簡單,沒有太多特別的規(guī)則和設計模式的要求,開發(fā)者可以很容易的掌握。JPA基于非侵入式原則設計,因此可以很容易的和其它框架或者容器集成。

2.4查詢能力

JPA的查詢語言是面向對象而非面向數據庫的,它以面向對象的自然語法構造查詢語句,可以看成是Hibernate HQL的等價物。JPA定義了獨特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一種擴展,它是針對實體的一種查詢語言,操作對象是實體,而不是關系數據庫的表,而且能夠支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能夠提供的高級查詢特性,甚至還能夠支持子查詢。

2.5高級特性

JPA 中能夠支持面向對象的高級特性,如類之間的繼承、多態(tài)和類之間的復雜關系,這樣的支持能夠讓開發(fā)者最大限度的使用面向對象的模型設計企業(yè)應用,而不需要自行處理這些特性在關系數據庫的持久化。

3.基于注解的使用

本篇只介紹注解的使用,另一種基于xml方式的使用大家有興趣可以自行了解一下。

3.1 JPA擁有哪些注解呢?

注解 解釋
@Entity 聲明類為實體或表。
@Table 聲明表名。
@Basic 指定非約束明確的各個字段。
@Embedded 指定類或它的值是一個可嵌入的類的實例的實體的屬性。
@Id 指定的類的屬性,用于識別(一個表中的主鍵)。
@GeneratedValue 指定如何標識屬性可以被初始化,例如自動、手動、或從序列表中獲得的值。
@Transient 指定的屬性,它是不持久的,即:該值永遠不會存儲在數據庫中。
@Column 指定持久屬性欄屬性。
@SequenceGenerator 指定在@GeneratedValue注解中指定的屬性的值。它創(chuàng)建了一個序列。
@TableGenerator 指定在@GeneratedValue批注指定屬性的值發(fā)生器。它創(chuàng)造了的值生成的表。
@AccessType 這種類型的注釋用于設置訪問類型。如果設置@AccessType(FIELD),則可以直接訪問變量并且不需要getter和setter,但必須為public。如果設置@AccessType(PROPERTY),通過getter和setter方法訪問Entity的變量。
@JoinColumn 指定一個實體組織或實體的集合。這是用在多對一和一對多關聯。
@UniqueConstraint 指定的字段和用于主要或輔助表的唯一約束。
@ColumnResult 參考使用select子句的SQL查詢中的列名。
@ManyToMany 定義了連接表之間的多對多一對多的關系。
@ManyToOne 定義了連接表之間的多對一的關系。
@OneToMany 定義了連接表之間存在一個一對多的關系。
@OneToOne 定義了連接表之間有一個一對一的關系。
@NamedQueries 指定命名查詢的列表。
@NamedQuery 指定使用靜態(tài)名稱的查詢。

了解了注解之后我們來看看如何使用吧

4.代碼實戰(zhàn)

4.1maven依賴

添加jpa起步依賴

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

4.2配置文件

在application.yml文件中添加如下配置

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mytest
    type: com.alibaba.druid.pool.DruidDataSource
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver //驅動
  jpa:
    hibernate:
      ddl-auto: update //自動更新
    show-sql: true  //日志中顯示sql語句

jpa.hibernate.ddl-auto是hibernate的配置屬性,其主要作用是:自動創(chuàng)建、更新、驗證數據庫表結構。該參數的幾種配置如下:

  • create:每次加載hibernate時都會刪除上一次的生成的表,然后根據你的model類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執(zhí)行,這就是導致數據庫表數據丟失的一個重要原因。
  • create-drop:每次加載hibernate時根據model類生成表,但是sessionFactory一關閉,表就自動刪除。
  • update:最常用的屬性,第一次加載hibernate時根據model類會自動建立起表的結構(前提是先建立好數據庫),以后加載hibernate時根據model類自動更新表結構,即使表結構改變了但表中的行仍然存在不會刪除以前的行。要注意的是當部署到服務器后,表結構是不會被馬上建立起來的,是要等應用第一次運行起來后才會。
  • validate:每次加載hibernate時,驗證創(chuàng)建數據庫表結構,只會和數據庫中的表進行比較,不會創(chuàng)建新表,但是會插入新值。

以上我們完成了基本的配置工作,記下來看一下如何進行表與實體的映射,以及數據訪問接口。

4.3創(chuàng)建實體以及數據訪問接口

首先來看一下實體類Person.java

@Entity
@Getter
@Setter
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    @Column(name = "name", nullable = true, length = 20)
    private String name;
    @Column(name = "agee", nullable = true, length = 4)
    private int age;
}

接著是PersonRepository.java,改接口只需要繼承JpaRepository接口即可。

public interface PersonRepository extends JpaRepository<Person, Long> {
}

然后寫一個rest接口以供測試使用。

@RestController
@RequestMapping(value = "person")
public class PerconController {
    @Autowired
    private PersonRepository personRepository;
    @PostMapping(path = "addPerson")
    public void addPerson(Person person) {
        personRepository.save(person);
    }
    @DeleteMapping(path = "deletePerson")
    public void deletePerson(Long id) {
        personRepository.delete(id);
    }
}

好了,讓我們來運行一下程序看看結果吧,啟動程序,查詢數據庫我們就可以看到,JPA以及自動幫我們創(chuàng)建了表

這里寫圖片描述

接下來我們調用一下addPerson接口。我們使用postman來測試:

這里寫圖片描述

然后通過查詢數據庫來看一下結果:

這里寫圖片描述

我們可以看到成功插入了數據,并且觀察表結構可以看到,agee是我們定義的column名稱,id為自增。并且從上面的repository接口代碼我們可以看到,接口中并沒有定義任何的方法,這是因為JpaRepository中幫我們定義了基礎的增刪改查方法,可以很方便的直接使用。

接下來我們來看一下如何編寫自己的方法。我們以根據name查詢person為例。添加一個rest接口

    @GET
    @Produces(TYPE_JSON)
    @Path("getPerson")
    public Object getPerson(@QueryParam("name") String name) {
        return personRepository.findByName(name);
    }

并在repository接口中添加如下查詢方法:

Person findByName(String name);

重啟之后讓我們來看一下查詢結果

這里寫圖片描述

我們可以看到通過name獲取到了想要的結果。我們也可以在日志中看到hibernate輸出的日志:

Hibernate: select person0_.id as id1_0_, person0_.agee as agee2_0_, person0_.name as name3_0_ from person person0_ where person0_.name=?

那么JPA是通過什么規(guī)則來根據方法名生成sql語句查詢的呢?

其實JPA在這里遵循Convention over configuration(約定大約配置)的原則,遵循spring 以及JPQL定義的方法命名。Spring提供了一套可以通過命名規(guī)則進行查詢構建的機制。這套機制會把方法名首先過濾一些關鍵字,比如 find…By, read…By, query…By, count…By 和 get…By 。系統會根據關鍵字將命名解析成2個子語句,第一個 By 是區(qū)分這兩個子語句的關鍵詞。這個 By 之前的子語句是查詢子語句(指明返回要查詢的對象),后面的部分是條件子語句。如果直接就是 findBy… 返回的就是定義Respository時指定的領域對象集合,同時JPQL中也定義了豐富的關鍵字:and、or、Between等等,下面我們來看一下JPQL中有哪些關鍵字:

Keyword Sample JPQL snippet
And findByLastnameAndFirstname … where x.lastname = ?1 and
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Is,Equals findByFirstnameIs,findByFirstnameEquals … where x.firstname = ?1
Between findByStartDateBetween … where x.startDate between ?1 and ?2
LessThan findByAgeLessThan … where x.age < ?1
LessThanEqual findByAgeLessThanEqual … where x.age ⇐ ?1
GreaterThan findByAgeGreaterThan … where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1
After findByStartDateAfter … where x.startDate > ?1
Before findByStartDateBefore … where x.startDate < ?1
IsNull findByAgeIsNull … where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull … where x.age not null
Like findByFirstnameLike … where x.firstname like ?1
NotLike findByFirstnameNotLike … where x.firstname not like ?1
StartingWith findByFirstnameStartingWith … where x.firstname like ?1 (parameter bound with appended %)
EndingWith findByFirstnameEndingWith … where x.firstname like ?1 (parameter bound with prepended %)
Containing findByFirstnameContaining … where x.firstname like ?1 (parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
Not findByLastnameNot … where x.lastname <> ?1
In findByAgeIn(Collection ages) … where x.age in ?1
NotIn findByAgeNotIn(Collection age) … where x.age not in ?1
TRUE findByActiveTrue() … where x.active = true
FALSE findByActiveFalse() … where x.active = false
IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstame) = UPPER(?1)
……

以上就是jpa的簡單實用和介紹。

總結

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!

相關文章

  • Java SpringMVC 集成靜態(tài)資源的方式你了解嗎

    Java SpringMVC 集成靜態(tài)資源的方式你了解嗎

    本篇文章主要介紹了SpringMVC集成靜態(tài)資源的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-10-10
  • SpringBoot配置多個數據源超簡單步驟(連接多個數據庫)

    SpringBoot配置多個數據源超簡單步驟(連接多個數據庫)

    公司項目有連接多個不同數據庫的需求,特研究了一下,根據網上的資料,這篇文章主要給大家介紹了關于SpringBoot配置多個數據源(連接多個數據庫)的相關資料,需要的朋友可以參考下
    2024-05-05
  • Java方法遞歸調用實例解析

    Java方法遞歸調用實例解析

    這篇文章主要介紹了Java方法遞歸調用實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Java日常練習題,每天進步一點點(45)

    Java日常練習題,每天進步一點點(45)

    下面小編就為大家?guī)硪黄狫ava基礎的幾道練習題(分享)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • Spring-cloud 服務發(fā)現與消費(以ribbon為例)

    Spring-cloud 服務發(fā)現與消費(以ribbon為例)

    這篇文章主要介紹了Spring-cloud 服務發(fā)現與消費(以ribbon為例),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Java獲取兩個集合List的交集、補集、并集(相加)和差集(相減)的不同方式

    Java獲取兩個集合List的交集、補集、并集(相加)和差集(相減)的不同方式

    這篇文章主要給大家介紹了關于Java獲取兩個集合List的交集、補集、并集(相加)和差集(相減)的不同方式,在一般操作中對于list集合取交集、差集、并集,比較簡單,需要的朋友可以參考下
    2023-08-08
  • Java中的private、protected、public和default的區(qū)別(詳解)

    Java中的private、protected、public和default的區(qū)別(詳解)

    下面小編就為大家?guī)硪黄狫ava中的private、protected、public和default的區(qū)別(詳解)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • Java Spring5學習之JdbcTemplate詳解

    Java Spring5學習之JdbcTemplate詳解

    這篇文章主要介紹了Java Spring5學習之JdbcTemplate詳解,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • springcloud-gateway整合jwt+jcasbin實現權限控制的詳細過程

    springcloud-gateway整合jwt+jcasbin實現權限控制的詳細過程

    這篇文章主要介紹了springcloud-gateway整合jwt+jcasbin實現權限控制,基于springboot+springcloud+nacos的簡單分布式項目,項目交互采用openFeign框架,單獨提取出來成為一個獨立的model,需要的朋友可以參考下
    2023-02-02
  • metershpere實現調用自定義jar包中的方法

    metershpere實現調用自定義jar包中的方法

    在MeterSphere接口測試中,面對多層循環(huán)邏輯和邏輯判斷等復雜情況,直接編寫測試用例往往顯得混亂不便,本文介紹了一個簡化這一過程的方法:首先使用IDEA創(chuàng)建Maven工程,編寫所需邏輯并生成jar包;然后在MeterSphere中上傳此jar包
    2024-10-10

最新評論