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

Spring Boot JPA中java 8 的應(yīng)用實例

 更新時間:2020年02月27日 10:17:10   作者:flydean  
這篇文章主要介紹了Spring Boot JPA中java 8 的應(yīng)用實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

上篇文章中我們講到了如何在Spring Boot中使用JPA。 本文我們將會講解如何在Spring Boot JPA中使用java 8 中的新特習(xí)慣如:Optional, Stream API 和 CompletableFuture的使用。

Optional

我們從數(shù)據(jù)庫中獲取的數(shù)據(jù)有可能是空的,對于這樣的情況Java 8 提供了Optional類,用來防止出現(xiàn)空值的情況。我們看下怎么在Repository 中定義一個Optional的方法:

public interface BookRepository extends JpaRepository<Book, Long> {

  Optional<Book> findOneByTitle(String title);
}

我們看下測試方法怎么實現(xiàn):

  @Test
  public void testFindOneByTitle(){

    Book book = new Book();
    book.setTitle("title");
    book.setAuthor(randomAlphabetic(15));

    bookRepository.save(book);
    log.info(bookRepository.findOneByTitle("title").orElse(new Book()).toString());
  }

Stream API

為什么會有Stream API呢? 我們舉個例子,如果我們想要獲取數(shù)據(jù)庫中所有的Book, 我們可以定義如下的方法:

public interface BookRepository extends JpaRepository<Book, Long> {

  List<Book> findAll();

  Stream<Book> findAllByTitle(String title);

}

上面的findAll方法會獲取所有的Book,但是當(dāng)數(shù)據(jù)庫里面的數(shù)據(jù)太多的話,就會消耗過多的系統(tǒng)內(nèi)存,甚至有可能導(dǎo)致程序崩潰。

為了解決這個問題,我們可以定義如下的方法:

Stream<Book> findAllByTitle(String title);

當(dāng)你使用Stream的時候,記得需要close它。 我們可以使用java 8 中的try語句來自動關(guān)閉:

  @Test
  @Transactional
  public void testFindAll(){

    Book book = new Book();
    book.setTitle("titleAll");
    book.setAuthor(randomAlphabetic(15));
    bookRepository.save(book);

    try (Stream<Book> foundBookStream
           = bookRepository.findAllByTitle("titleAll")) {
      assertThat(foundBookStream.count(), equalTo(1l));
    }
  }

這里要注意, 使用Stream必須要在Transaction中使用。否則會報如下錯誤:

org.springframework.dao.InvalidDataAccessApiUsageException: You're trying to execute a streaming query method without a surrounding transaction that keeps the connection open so that the Stream can actually be consumed. Make sure the code consuming the stream uses @Transactional or any other way of declaring a (read-only) transaction.

所以這里我們加上了@Transactional 注解。

CompletableFuture

使用java 8 的CompletableFuture, 我們還可以異步執(zhí)行查詢語句:

 

  @Async
  CompletableFuture<Book> findOneByAuthor(String author);

我們這樣使用這個方法:

  @Test
  public void testByAuthor() throws ExecutionException, InterruptedException {
    Book book = new Book();
    book.setTitle("titleA");
    book.setAuthor("author");
    bookRepository.save(book);

    log.info(bookRepository.findOneByAuthor("author").get().toString());
  }

本文的例子可以參考https://github.com/ddean2009/learn-springboot2/tree/master/springboot-jpa

到此這篇關(guān)于Spring Boot JPA中java 8 的應(yīng)用實例的文章就介紹到這了,更多相關(guān)java8中Spring Boot JPA使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java ClassLoader機制詳細講解

    java ClassLoader機制詳細講解

    ClassLoader一個經(jīng)常出現(xiàn)又讓很多人望而卻步的詞,本文將試圖以最淺顯易懂的方式來講解 ClassLoader,希望能對不了解該機制的朋友起到一點點作用
    2016-07-07
  • MyBatis-Flex+ShardingSphere-JDBC多數(shù)據(jù)源分庫分表實現(xiàn)

    MyBatis-Flex+ShardingSphere-JDBC多數(shù)據(jù)源分庫分表實現(xiàn)

    本文介紹了使用MyBatis-Flex和ShardingSphere-JDBC實現(xiàn)多數(shù)據(jù)源分庫分表的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • Java Socket 編程詳解

    Java Socket 編程詳解

    Java Socket 編程是指使用 Java 語言進行網(wǎng)絡(luò)通信的過程,包括建立連接、傳輸數(shù)據(jù)和關(guān)閉連接等操作,本文將詳細介紹Java Socket編程,需要的朋友可以參考下
    2023-05-05
  • java 使用Scanner類接收從控制臺輸入的數(shù)據(jù)方式

    java 使用Scanner類接收從控制臺輸入的數(shù)據(jù)方式

    這篇文章主要介紹了java 使用Scanner類接收從控制臺輸入的數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • MyBatisPlus 主鍵策略的實現(xiàn)(4種)

    MyBatisPlus 主鍵策略的實現(xiàn)(4種)

    MyBatis Plus 集成了多種主鍵策略,幫助用戶快速生成主鍵,本文主要介紹了MyBatisPlus主鍵策略的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • 使用java web 在jsp文件及Class中連接MySQL和SQLserver 的驅(qū)動方法

    使用java web 在jsp文件及Class中連接MySQL和SQLserver 的驅(qū)動方法

    這篇文章主要介紹了使用java web 在jsp文件及Class中連接MySQL和SQLserver的驅(qū)動方法的相關(guān)資料,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • Java split()方法中的特殊符號舉例詳解

    Java split()方法中的特殊符號舉例詳解

    Java中的split方法可以將一個字符串按照指定的分隔符進行分割,返回一個字符串?dāng)?shù)組,這篇文章主要給大家介紹了關(guān)于Java split()方法中的特殊符號的相關(guān)資料,需要的朋友可以參考下
    2023-07-07
  • Java設(shè)計模式中的抽象工廠模式解讀

    Java設(shè)計模式中的抽象工廠模式解讀

    這篇文章主要介紹了Java設(shè)計模式中的抽象工廠模式解讀,抽象工廠模式為創(chuàng)建一組相關(guān)或相互依賴的對象提供一個接口,而且無需指定他們的具體類,需要的朋友可以參考下
    2023-11-11
  • JS實現(xiàn)冒泡排序,插入排序和快速排序并排序輸出

    JS實現(xiàn)冒泡排序,插入排序和快速排序并排序輸出

    這篇文章主要介紹了JS實現(xiàn)冒泡排序,插入排序和快速排序并從input文本框中獲取內(nèi)容進行排序輸出,需要的朋友可以參考下
    2015-07-07
  • Java經(jīng)典設(shè)計模式之策略模式原理與用法詳解

    Java經(jīng)典設(shè)計模式之策略模式原理與用法詳解

    這篇文章主要介紹了Java經(jīng)典設(shè)計模式之策略模式,簡單說明了策略模式的概念、原理并結(jié)合實例形式分析了java策略模式的具有用法與相關(guān)注意事項,需要的朋友可以參考下
    2017-08-08

最新評論

新民市| 茂名市| 新闻| 嘉荫县| 健康| 马山县| 恩施市| 闽侯县| 锦州市| 宁化县| 潮州市| 通州市| 绿春县| 武宁县| 台南县| 罗平县| 常州市| 舞钢市| 绍兴县| 霍城县| 修文县| 阿拉善右旗| 乌兰浩特市| 伊川县| 北海市| 肃南| 庐江县| 澄江县| 嘉黎县| 宜兴市| 鹤峰县| 湖州市| 顺平县| 平阳县| 页游| 定边县| 营口市| 贵德县| 梧州市| 嵊泗县| 兰州市|