最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解在Spring Boot中使用JPA

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

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

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

什么是JPA

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

使用流程

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

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

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

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

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

配置基本屬性

接下來(lái)需要我們?cè)赼pplication.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)于這里的配置我說(shuō)如下幾點(diǎn):

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

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

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

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

5.第六行表示hibernate在操作的時(shí)候在控制臺(tái)打印真實(shí)的sql語(yǔ)句

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

OK,以上就是我們?cè)赼pplication.properties中對(duì)JPA進(jìn)行的一個(gè)簡(jiǎn)單配置。

定義映射實(shí)體類(lèi)

接下來(lái),定義相應(yīng)的實(shí)體類(lèi),在Project啟動(dòng)時(shí),系統(tǒng)會(huì)根據(jù)實(shí)體類(lèi)創(chuàng)建相應(yīng)的數(shù)據(jù)表,我的實(shí)體類(lèi)如下:

@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;
  }
}

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

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

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

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)于這個(gè)數(shù)據(jù)訪問(wèn)接口,我說(shuō)如下幾點(diǎn):

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

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

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

4.使用NamedQuery來(lái)查詢,就是我們直接在實(shí)體類(lèi)上使用@NamedQuery注解來(lái)定義查詢方法和方法名,一個(gè)名稱(chēng)對(duì)應(yīng)一個(gè)查詢語(yǔ)句,具體可以參考我們上文的實(shí)體類(lèi)

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

編寫(xiě)測(cè)試Controller

數(shù)據(jù)訪問(wèn)接口都有了,接下來(lái)就是一個(gè)Controller了,我們寫(xiě)一個(gè)簡(jiǎn)單的Controller,用來(lái)測(cè)試一下上文中的數(shù)據(jù)訪問(wèn)接口是否正確,如下:

@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();
  }
}

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中對(duì)象快速?gòu)?fù)制的幾種方式詳解

    Java中對(duì)象快速?gòu)?fù)制的幾種方式詳解

    這篇文章主要介紹了Java中對(duì)象快速?gòu)?fù)制的幾種方式詳解,對(duì)象的克隆是指創(chuàng)建一個(gè)新的對(duì)象,且新的對(duì)象的狀態(tài)與原始對(duì)象的狀態(tài)相同,當(dāng)對(duì)克隆的新對(duì)象進(jìn)行修改時(shí),不會(huì)影響原始對(duì)象的狀態(tài),需要的朋友可以參考下
    2023-08-08
  • Java 正則表達(dá)式詳細(xì)介紹

    Java 正則表達(dá)式詳細(xì)介紹

    本文主要介紹 Java 正則表達(dá)式的內(nèi)容,這里整理了Java 正則表達(dá)式的相關(guān)資料,并詳細(xì)介紹,附有代碼示例,有興趣的小伙伴可以參考下
    2016-09-09
  • java之多線程搶火車(chē)票的實(shí)現(xiàn)示例

    java之多線程搶火車(chē)票的實(shí)現(xiàn)示例

    生活中有很多多線程的案例,購(gòu)票就是一個(gè)很常見(jiàn)的問(wèn)題,本文主要介紹了java之多線程搶火車(chē)票的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • SpringMVC處理數(shù)據(jù)輸出的實(shí)例代碼

    SpringMVC處理數(shù)據(jù)輸出的實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于SpringMVC處理數(shù)據(jù)輸出的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 詳解java 客戶端鏈接不上redis解決方案

    詳解java 客戶端鏈接不上redis解決方案

    這篇文章主要介紹了詳解java 客戶端鏈接不上redis解決方案,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • Java Swing組件實(shí)現(xiàn)進(jìn)度監(jiān)視功能示例

    Java Swing組件實(shí)現(xiàn)進(jìn)度監(jiān)視功能示例

    這篇文章主要介紹了Java Swing組件實(shí)現(xiàn)進(jìn)度監(jiān)視功能,結(jié)合完整實(shí)例形式詳細(xì)分析了Java基于Swing組件實(shí)現(xiàn)進(jìn)度條顯示功能的具體操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2018-02-02
  • java equals和==的區(qū)別詳解

    java equals和==的區(qū)別詳解

    這篇文章主要介紹了java equals和==的區(qū)別詳解的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • java編程實(shí)現(xiàn)屏幕截圖(截屏)代碼總結(jié)

    java編程實(shí)現(xiàn)屏幕截圖(截屏)代碼總結(jié)

    這篇文章主要介紹了java編程實(shí)現(xiàn)屏幕截圖(截屏)代碼,結(jié)合3個(gè)實(shí)例總結(jié)分析了Java截屏?xí)r頁(yè)面抓取及圖片保存的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • Java實(shí)現(xiàn)按權(quán)重隨機(jī)數(shù)

    Java實(shí)現(xiàn)按權(quán)重隨機(jī)數(shù)

    這篇文章主要介紹了Java實(shí)現(xiàn)按權(quán)重隨機(jī)數(shù),本文給出了提出問(wèn)題、分析問(wèn)題、解決問(wèn)題三個(gè)步驟,需要的朋友可以參考下
    2015-04-04
  • EventBus與Spring Event區(qū)別詳解(EventBus 事件機(jī)制,Spring Event事件機(jī)制)

    EventBus與Spring Event區(qū)別詳解(EventBus 事件機(jī)制,Spring Event事件機(jī)制)

    這篇文章主要介紹了EventBus與Spring Event區(qū)別,需要的朋友可以參考下
    2020-02-02

最新評(píng)論

临邑县| 卫辉市| 盱眙县| 社旗县| 理塘县| 邵武市| 玉龙| 上高县| 嘉峪关市| 昔阳县| 蓬莱市| 石楼县| 怀柔区| 讷河市| 上高县| 克什克腾旗| 正蓝旗| 岳普湖县| 东辽县| 景宁| 洛川县| 塔城市| 马边| 吴川市| 通江县| 呼图壁县| 仙桃市| 盘锦市| 中超| 广昌县| 台南市| 泸西县| 长垣县| 裕民县| 罗源县| 北碚区| 平顶山市| 嘉鱼县| 宁安市| 时尚| 道孚县|