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

詳解在Spring Boot中使用JPA

 更新時間:2017年05月19日 14:42:22   作者:_江南一點雨  
本篇文章主要介紹了詳解在Spring Boot中使用JPA,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前面關(guān)于spring Boot的文章已經(jīng)介紹了很多了,但是一直都沒有涉及到數(shù)據(jù)庫的操作問題,數(shù)據(jù)庫操作當然也是我們在開發(fā)中無法回避的問題,那么今天我們就來看看Spring Boot給我們提供了哪些瘋狂的方式來解決數(shù)據(jù)庫的操作問題。

OK,廢話不多說,讓我們愉快的開啟今天的數(shù)據(jù)庫操作之旅吧!

什么是JPA

一說JavaWeb,很多小伙伴都知道SSH,這個H代表的就是hibernate框架,這個小伙伴們都知道,可是什么又是JPA呢?相信許多剛?cè)腴T的小伙伴聽說過但不是特別清楚,首先JPA的全稱叫做Java Persistence API,JPA是一個基于O/R映射的標準規(guī)范,在這個規(guī)范中,JPA只定義標準規(guī)則,不提供實現(xiàn),使用者則需要按照規(guī)范中定義的方式來使用。目前JPA的主要實現(xiàn)有Hibernate、EclipseLink、OpenJPA等,事實上,由于Hibernate在數(shù)據(jù)訪問解決技術(shù)領(lǐng)域的絕對霸主地位,JPA的標準基本是由Hibernate來主導的。雖然做開發(fā)的小伙伴不怎么喜歡度娘,不過度娘關(guān)于JPA的介紹個人覺得倒是比較清晰,有興趣的小伙伴可前去了解下。另外,Spring框架為我們提供了Spring Data JPA這樣一個東東,可以減少我們使用JPA時的代碼量。

使用流程

創(chuàng)建工程并添加相關(guān)依賴

在Spring Boot中使用JPA,我們在創(chuàng)建工程的時候需要選擇JPA依賴,如下:

其他的步驟和我們創(chuàng)建一個普通的Spring Boot項目是一樣的

項目創(chuàng)建成功之后,我這里是使用MySQL做演示,因此還需要添加MySql驅(qū)動,在pom.xml文件中添加如下依賴:

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.40</version>
    </dependency>

配置基本屬性

接下來需要我們在application.properties中配置數(shù)據(jù)源和jpa的基本的相關(guān)屬性,如下:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/jpatest
spring.datasource.username=root
spring.datasource.password=123456

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jackson.serialization.indent_output=true

關(guān)于這里的配置我說如下幾點:

1.第一行表示驅(qū)動的名稱,這個和具體的數(shù)據(jù)庫驅(qū)動有關(guān),視情況而定,我這里使用了MySql數(shù)據(jù)庫,所以驅(qū)動名為com.mysql.jdbc.Driver

2.第二行表示數(shù)據(jù)庫連接地址,當然也是視情況而定

3.第三四行表示數(shù)據(jù)庫連接的用戶名和密碼

4.第五行則配置了實體類維護數(shù)據(jù)庫表結(jié)構(gòu)的具體行為,update表示當實體類的屬性發(fā)生變化時,表結(jié)構(gòu)跟著更新,這里我們也可以取值create,這個create表示啟動的時候刪除上一次生成的表,并根據(jù)實體類重新生成表,這個時候之前表中的數(shù)據(jù)就會被清空;還可以取值create-drop,這個表示啟動時根據(jù)實體類生成表,但是當sessionFactory關(guān)閉的時候表會被刪除;validate表示啟動時驗證實體類和數(shù)據(jù)表是否一致;none表示啥都不做。

5.第六行表示hibernate在操作的時候在控制臺打印真實的sql語句

6.第七行表示格式化輸出的json字符串

OK,以上就是我們在application.properties中對JPA進行的一個簡單配置。

定義映射實體類

接下來,定義相應的實體類,在Project啟動時,系統(tǒng)會根據(jù)實體類創(chuàng)建相應的數(shù)據(jù)表,我的實體類如下:

@Entity
@NamedQuery(name = "Person.withNameAndAddressNamedQuery",
    query = "select p from Person p where p.name=?1 and p.address=?2")
public class Person {
  @Id
  @GeneratedValue
  private Long id;
  private String name;
  private Integer age;
  private String address;

  public Person() {
  }

  public Person(Long id, String name, Integer age, String address) {
    this.id = id;
    this.name = name;
    this.age = age;
    this.address = address;
  }

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Integer getAge() {
    return age;
  }

  public void setAge(Integer age) {
    this.age = age;
  }

  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }
}

首先在實體類上我們使用了@Entity注解,這個表示這是一個和數(shù)據(jù)庫表映射的實體類,在屬性id上我們添加了@Id注解,表示該字段是一個id,@GeneratedValue注解則表示該字段自增。@NamedQuery注解表示一個NamedQuery查詢,這里一個名稱代表一個查詢語句,我們一會可以在控制器中直接調(diào)用@NamedQuery中的withNameAndAddressNamedQuery方法,該方法代表的查詢語句是select p from Person p where p.name=?1 and p.address=?2。

定義數(shù)據(jù)訪問接口

OK,做好上面幾個步驟之后,接下來我們就可以定義數(shù)據(jù)訪問接口了,我們的數(shù)據(jù)訪問接口需要繼承JpaRepository類,我在數(shù)據(jù)訪問接口中一共定義了四個方法,如下:

public interface PersonRepository extends JpaRepository<Person, Long> {
  List<Person> findByAddress(String name);

  Person findByNameAndAddress(String name, String address);

  @Query("select p from Person p where p.name=:name and p.address=:address")
  Person withNameAndAddressQuery(@Param("name") String name, @Param("address") String address);

  Person withNameAndAddressNamedQuery(String name, String address);

}

關(guān)于這個數(shù)據(jù)訪問接口,我說如下幾點:

1.當我們繼承JpaRepository接口后,我們就自動具備了如下數(shù)據(jù)訪問方法:

List<T> findAll();
List<T> findAll(Sort var1);
List<T> findAll(Iterable<ID> var1);
<S extends T> List<S> save(Iterable<S> var1);
void flush();
<S extends T> S saveAndFlush(S var1);
void deleteInBatch(Iterable<T> var1);
void deleteAllInBatch();
T getOne(ID var1);
<S extends T> List<S> findAll(Example<S> var1);
<S extends T> List<S> findAll(Example<S> var1, Sort var2);

2.我們可以在接口中定義查詢方法,可以按照屬性名來查詢,但是方法的命名方式是固定的,比如第一個方法和第二個方法,第一個方法表示根據(jù)一個屬性查詢,第二個方法表示根據(jù)多個屬性查詢,findBy、And等可以算作是這里的查詢關(guān)鍵字了,如果寫作其他名稱則系統(tǒng)不能識別,類似的關(guān)鍵字還有Like、Or、Is、Equals、Between等,而這里的findBy關(guān)鍵字又可以被find、read、readBy、query、queryBy、get、getBy等來代替。

3.在查詢的過程中我們也可以限制查詢結(jié)果,這里使用的關(guān)鍵字是top、first等,比如查詢前10條數(shù)據(jù)我們可以寫作:
List<Person> findFirst10ByName(String name);

4.使用NamedQuery來查詢,就是我們直接在實體類上使用@NamedQuery注解來定義查詢方法和方法名,一個名稱對應一個查詢語句,具體可以參考我們上文的實體類

5.我們也可以向第三個方法那樣添加@Query注解,當我調(diào)用這個方法的時候使用這個注解中的sql語句進行查詢,方法的參數(shù)則是注解中的占位符的值。

編寫測試Controller

數(shù)據(jù)訪問接口都有了,接下來就是一個Controller了,我們寫一個簡單的Controller,用來測試一下上文中的數(shù)據(jù)訪問接口是否正確,如下:

@RestController
public class DataController {
  @Autowired
  PersonRepository personRepository;

  @RequestMapping("/save")
  public Person save(String name,String address,Integer age) {
    Person person = personRepository.save(new Person(null, name, age, address));
    return person;
  }

  @RequestMapping("/q1")
  public List<Person> q1(String address) {
    List<Person> people = personRepository.findByAddress(address);
    return people;
  }

  @RequestMapping("/q2")
  public Person q2(String name, String address) {
    Person people = personRepository.findByNameAndAddress(name, address);
    return people;
  }

  @RequestMapping("/q3")
  public Person q3(String name, String address) {
    Person person = personRepository.withNameAndAddressQuery(name, address);
    return person;
  }

  @RequestMapping("/q4")
  public Person q4(String name, String address) {
    Person person = personRepository.withNameAndAddressNamedQuery(name, address);
    return person;
  }
  @RequestMapping("/sort")
  public List<Person> sort() {
    List<Person> people = personRepository.findAll(new Sort(Sort.Direction.ASC, "age"));
    return people;
  }
  @RequestMapping("/page")
  public Page<Person> page(int page,int size){
    Page<Person> all = personRepository.findAll(new PageRequest(page, size));
    return all;
  }
  @RequestMapping("/all")
  public List<Person> all(){
    return personRepository.findAll();
  }
}

這里的代碼都很簡單,我就不再一一進行解釋了,值得說的是第36行代碼表示根據(jù)age對查詢結(jié)果進行排序然后顯示出來,第40行的方法表示一個分頁查詢,第一個參數(shù)表示頁數(shù),從0開始計,第二個參數(shù)表示每頁的數(shù)據(jù)量。最后在瀏覽器中分別測試這幾個接口就可以了,我這里就不再展示測試頁面了,小伙伴們自行測試。

本文源碼下載:本文GitHub地址

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中String類getBytes()方法詳解與完整實例

    Java中String類getBytes()方法詳解與完整實例

    這篇文章主要給大家介紹了關(guān)于Java中String類getBytes()方法詳解與完整實例的相關(guān)資料,getBytes()是Java編程語言中將一個字符串轉(zhuǎn)化為一個字節(jié)數(shù)組byte[]的方法,需要的朋友可以參考下
    2023-10-10
  • MyBatis實現(xiàn)萬能Map和模糊查詢

    MyBatis實現(xiàn)萬能Map和模糊查詢

    本文主要介紹了MyBatis實現(xiàn)萬能Map和模糊查詢,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2021-07-07
  • 使用RocketMQTemplate發(fā)送帶tags的消息

    使用RocketMQTemplate發(fā)送帶tags的消息

    這篇文章主要介紹了使用RocketMQTemplate發(fā)送帶tags的消息,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java開發(fā)AOP面向切面編程入門

    java開發(fā)AOP面向切面編程入門

    這篇文章主要介紹了java開發(fā)的AOP面向切面編程入門的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步學有所得
    2021-10-10
  • Spring Boot集成netty實現(xiàn)客戶端服務端交互示例詳解

    Spring Boot集成netty實現(xiàn)客戶端服務端交互示例詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot集成netty實現(xiàn)客戶端服務端交互的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-12-12
  • MAC下如何設(shè)置JDK環(huán)境變量

    MAC下如何設(shè)置JDK環(huán)境變量

    這篇文章主要介紹了MAC下如何設(shè)置JDK環(huán)境變量問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • jdbc實現(xiàn)寵物商店管理系統(tǒng)

    jdbc實現(xiàn)寵物商店管理系統(tǒng)

    這篇文章主要為大家詳細介紹了jdbc實現(xiàn)寵物商店管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • 非常實用的java自動答題計時計分器

    非常實用的java自動答題計時計分器

    這篇文章主要為大家詳細介紹了非常實用的java自動答題計時計分器的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 詳解SpringBoot restful api的單元測試

    詳解SpringBoot restful api的單元測試

    本篇文章主要介紹了詳解SpringBoot restful api的單元測試,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • java基于servlet的文件異步上傳

    java基于servlet的文件異步上傳

    本篇文章主要介紹了java基于servlet的文件異步上傳,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-10-10

最新評論