1. 程式人生 > >spring boot 中使用 jpa以及jpa介紹

spring boot 中使用 jpa以及jpa介紹

最近在專案中使用了一下jpa,發現還是挺好用的。這裡就來講一下jpa以及在spring boot中的使用。
在這裡我們先來了解一下jpa。

1.什麼是jpa呢?

JPA顧名思義就是Java Persistence API的意思,是JDK 5.0註解或XML描述物件-關係表的對映關係,並將執行期的實體物件持久化到資料庫中。

2.jpa具有什麼優勢?

2.1標準化
JPA 是 JCP 組織釋出的 Java EE 標準之一,因此任何聲稱符合 JPA 標準的框架都遵循同樣的架構,提供相同的訪問API,這保證了基於JPA開發的企業應用能夠經過少量的修改就能夠在不同的JPA框架下執行。
2.2容器級特性的支援
JPA框架中支援大資料集、事務、併發等容器級事務,這使得 JPA 超越了簡單持久化框架的侷限,在企業應用發揮更大的作用。
2.3簡單方便
JPA的主要目標之一就是提供更加簡單的程式設計模型:在JPA框架下建立實體和建立Java 類一樣簡單,沒有任何的約束和限制,只需要使用 javax.persistence.Entity進行註釋,JPA的框架和介面也都非常簡單,沒有太多特別的規則和設計模式的要求,開發者可以很容易的掌握。JPA基於非侵入式原則設計,因此可以很容易的和其它框架或者容器整合。
2.4查詢能力
JPA的查詢語言是面向物件而非面向資料庫的,它以面向物件的自然語法構造查詢語句,可以看成是Hibernate HQL的等價物。JPA定義了獨特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一種擴充套件,它是針對實體的一種查詢語言,操作物件是實體,而不是關係資料庫的表,而且能夠支援批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能夠提供的高階查詢特性,甚至還能夠支援子查詢。
2.4高階特性
JPA 中能夠支援面向物件的高階特性,如類之間的繼承、多型和類之間的複雜關係,這樣的支援能夠讓開發者最大限度的使用面向物件的模型設計企業應用,而不需要自行處理這些特性在關係資料庫的持久化。

3.基於註解的使用

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

3.1 JPA擁有哪些註解呢?

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

瞭解了註解之後我們來看看如何使用吧

4.程式碼實戰

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的配置屬性,其主要作用是:自動建立、更新、驗證資料庫表結構。該引數的幾種配置如下:
    ·create:每次載入hibernate時都會刪除上一次的生成的表,然後根據你的model類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執行,這就是導致資料庫表資料丟失的一個重要原因。
    ·create-drop:每次載入hibernate時根據model類生成表,但是sessionFactory一關閉,表就自動刪除。
    ·update:最常用的屬性,第一次載入hibernate時根據model類會自動建立起表的結構(前提是先建立好資料庫),以後載入hibernate時根據model類自動更新表結構,即使表結構改變了但表中的行仍然存在不會刪除以前的行。要注意的是當部署到伺服器後,表結構是不會被馬上建立起來的,是要等應用第一次執行起來後才會。
    ·validate:每次載入hibernate時,驗證建立資料庫表結構,只會和資料庫中的表進行比較,不會建立新表,但是會插入新值。

以上我們完成了基本的配置工作,記下來看一下如何進行表與實體的對映,以及資料訪問介面。

4.3建立實體以及資料訪問介面

首先來看一下實體類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以及自動幫我們建立了表
這裡寫圖片描述

接下來我們呼叫一下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是通過什麼規則來根據方法名生成sql語句查詢的呢?
其實JPA在這裡遵循Convention over configuration(約定大約配置)的原則,遵循spring 以及JPQL定義的方法命名。Spring提供了一套可以通過命名規則進行查詢構建的機制。這套機制會把方法名首先過濾一些關鍵字,比如 find…By, read…By, query…By, count…By 和 get…By 。系統會根據關鍵字將命名解析成2個子語句,第一個 By 是區分這兩個子語句的關鍵詞。這個 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的簡單實用和介紹。

相關推薦

spring boot 使用 jpa以及jpa介紹

最近在專案中使用了一下jpa,發現還是挺好用的。這裡就來講一下jpa以及在spring boot中的使用。 在這裡我們先來了解一下jpa。 1.什麼是jpa呢? JPA顧名思義就是Java Persistence API的意思,是JDK 5.0註解或X

spring boot Spring data jpa數據庫表字段命名策略

_id -s ber data 駝峰命名 org body strategy 命名 spring boot 中Spring data jpa命名策略 數據庫,表字段命名是駝峰命名法(UserID),Spring data jpa 自動更新之後是 user_id, 表字段不對

Spring Boot使用Spring-data-jpa實現分頁查詢(轉)

分頁查詢 log def inpu database ext identity odin btn 在我們平時的工作中,查詢列表在我們的系統中基本隨處可見,那麽我們如何使用jpa進行多條件查詢以及查詢列表分頁呢?下面我將介紹兩種多條件查詢方式。 1、引入起步依賴

Spring Boot使用Spring-data-jpa訪問資料

一 點睛 只需要通過編寫一個繼承自JpaRepository的介面就能完成資料訪問。 二 實戰 1 新建依賴 <dependencies> <dependency> <groupId>org

spring boot使用JPA詳解

1.首先在pom.xml檔案中匯入jar包 <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <g

Spring Bootspring-data-jpa

Spring Boot中的spring-data-jpa 簡介 1. pom.xml 2. application.properties 3.實體類 4. repository 5.測試 簡介 JPA:Java Per

Spring Boot使用Spring-data-jpa讓資料訪問更簡單、更優雅

在上一篇Spring中使用JdbcTemplate訪問資料庫 中介紹了一種基本的資料訪問方式,結合構建RESTful API、使用Thymeleaf模板引擎渲染Web檢視的內容就已經可以完成App服務端和Web站點的開發任務了。  然而,在實際開發過程中,對資料庫的操作

Spring Boot 使用 JPA 和 MySQL

在Spring Boot中使用JPA和MySQL 最近專案中需要使用到MySQL資料庫,在此記錄一下Spring Boot中使用JPA進行資料訪問的基本過程。 本文的基本開發環境如下:spring-boot-1.4.2 & jdk-1.8 &

Spring Boot:在Spring Boot使用Mysql和JPA

26. 四月 2015  Java, Spring, 開源產品(1) 本文向你展示如何在Spring Boot的Web應用中使用Mysq資料庫,也充分展示Spring Boot的優勢(儘可能少的程式碼和配置)。資料訪問層我們將使用Spring Data JPA和Hib

spring-bootjpa使用心得

小編是從python轉到java的,因此小編對python世界中的sqlalchemy和django-orm的牛逼和方便記憶有心。轉到java以後,發現java世界裡也有類似的工具,只不過說實話,跟python相比,確實有點弱。java中,提供資料庫ORM功能的

SpringCloud SpringBoot mybatis 分散式微服務(九)Spring Boot使用Spring-data-jpa讓資料訪問更簡單

然而,在實際開發過程中,對資料庫的操作無非就“增刪改查”。就最為普遍的單表操作而言,除了表和欄位不同外,語句都是類似的,開發人員需要寫大量類似而枯燥的語句來完成業務邏輯。為了解決這些大量枯燥的資料操作語句,我們第一個想到的是使用ORM框架,比如:Hibernate。通過整合H

springboot學習:初識在Spring Boot使用JPA

使用流程 建立工程並新增相關依賴 在Spring Boot中使用JPA,我們在建立工程的時候需要選擇JPA依賴,如下:   其他的步驟和我們建立一個普通的Spring Boot專案是一樣的,如果小夥伴不瞭解如何建立一個Spring Boot專案可以參考這篇文章初識Sp

Spring Boot使用Spring-data-jpa實現分頁查詢

在我們平時的工作中,查詢列表在我們的系統中基本隨處可見,那麼我們如何使用jpa進行多條件查詢以及查詢列表分頁呢?下面我將介紹兩種多條件查詢方式。 1、引入起步依賴   <dependency> <groupId>org.springframe

27.Spring-Boot攔截器靜態資源的處理(踩過坑)以及Spring mvc configuring拓展介紹

一.springboot中對靜態資源的處理  預設情況下,springboot提供存放放置靜態資源的資料夾:  /static  /public   /resources  /META-INF/resources 對於maven專案即就是存在src/main/re

使用spring bootJPA操作資料庫

前言 Spring boot中的JPA 使用的同學都會感覺到他的強大,簡直就是神器一般,通俗的說,根本不需要你寫sql,這就幫你節省了很多時間,那麼下面我們來一起來體驗下這款神器吧。 一、在pom中新增依賴 <dependency> <

spring boot實現響應圖片的方法以及改進

spring-bootController響應,噴出圖片,是一個很常見的功能,代碼如下@RequestMapping(value = { "/img/{filename:.+}" }, method = RequestMethod.GET, produces = { MediaType.I

Spring Boot整合Spirng-data-jpa及使用

Spring-data-jpa可根據實體類自動建立表結構,提供基本的增刪改查方法,資料訪問層非常簡潔,只是一層介面。 1.pom引進依賴 <!--dataSource--> <dependency> <groupI

spring boot配置檔案的載入位置以及優先順序

配置檔案載入位置 springboot 啟動會掃描以下位置的application.properties或者application.yml檔案作為Spring boot的預設配置檔案。 –file:./config/ –file:./ –classpath:/config/

Spring Boot配置檔案random以及佔位符的使用

1、隨機數 在Spring Boot 配置檔案中我們可以使用後隨機數random,語法如下: ${random.value}、${random.int}、${random.long} ${random.int(10)}、${random.int[1024,65536]} 下

Spring Boot使用thymeleaf以及各種取值,判斷,選擇,擷取等方式

Spring Boot中使用thymeleaf Spring Boot支援FreeMarker、Groovy、Thymeleaf和Mustache四種模板解析引擎,官方推薦使用Thymeleaf。 spring-boot-starter-thymeleaf 在Spring B