Spring Boot JPA中java 8 的应用实例

上篇文章中我们讲到了如何在Spring Boot中使用JPA。 本文我们将会讲解如何在Spring Boot JPA中使用java 8 中的新特习惯如:Optional, Stream API 和 CompletableFuture的使用。

Optional

我们从数据库中获取的数据有可能是空的,对于这样的情况Java 8 提供了Optional类,用来防止出现空值的情况。我们看下怎么在Repository 中定义一个Optional的方法:

public interface BookRepository extends JpaRepository<Book, Long> {

  Optional<Book> findOneByTitle(String title);
}

我们看下测试方法怎么实现:

  @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呢? 我们举个例子,如果我们想要获取数据库中所有的Book, 我们可以定义如下的方法:

public interface BookRepository extends JpaRepository<Book, Long> {

  List<Book> findAll();

  Stream<Book> findAllByTitle(String title);

}

上面的findAll方法会获取所有的Book,但是当数据库里面的数据太多的话,就会消耗过多的系统内存,甚至有可能导致程序崩溃。

为了解决这个问题,我们可以定义如下的方法:

Stream<Book> findAllByTitle(String title);

当你使用Stream的时候,记得需要close它。 我们可以使用java 8 中的try语句来自动关闭:

  @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, 我们还可以异步执行查询语句:

  @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

到此这篇关于Spring Boot JPA中java 8 的应用实例的文章就介绍到这了,更多相关java8中Spring Boot JPA使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot集成Spring Data JPA及读写分离

    相关代码: github OSCchina JPA是什么 JPA(Java Persistence API)是Sun官方提出的Java持久化规范,它为Java开发人员提供了一种对象/关联映射工具 来管理Java应用中的关系数据.它包括以下几方面的内容: 1.ORM映射 支持xml和注解方式建立实体与表之间的映射. 2.Java持久化API 定义了一些常用的CRUD接口,我们只需直接调用,而不需要考虑底层JDBC和SQL的细节. 3.JPQL查询语言 这是持久化操作中很重要的一个方面,通过面向对象

  • 详解基于Spring Boot与Spring Data JPA的多数据源配置

    由于项目需要,最近研究了一下基于spring Boot与Spring Data JPA的多数据源配置问题.以下是传统的单数据源配置代码.这里使用的是Spring的Annotation在代码内部直接配置的方式,没有使用任何XML文件. @Configuration @EnableJpaRepositories(basePackages = "org.lyndon.repository") @EnableTransactionManagement @PropertySource("

  • 详解在Spring Boot中使用JPA

    前面关于spring Boot的文章已经介绍了很多了,但是一直都没有涉及到数据库的操作问题,数据库操作当然也是我们在开发中无法回避的问题,那么今天我们就来看看Spring Boot给我们提供了哪些疯狂的方式来解决数据库的操作问题. OK,废话不多说,让我们愉快的开启今天的数据库操作之旅吧! 什么是JPA 一说JavaWeb,很多小伙伴都知道SSH,这个H代表的就是hibernate框架,这个小伙伴们都知道,可是什么又是JPA呢?相信许多刚入门的小伙伴听说过但不是特别清楚,首先JPA的全称叫做Ja

  • Spring boot jpa 删除数据和事务管理的问题实例详解

    今天我们介绍的是jpa删除和事务的一些坑,接下来看看具体内容. 业务场景(这是一个在线考试系统)和代码:根据问题的id删除答案 repository层: int deleteByQuestionId(Integer questionId); service 层: public void deleteChoiceAnswerByQuestionId(Integer questionId) { choiceAnswerRepository.deleteByQuestionId(questionId)

  • 详解SpringBoot实现JPA的save方法不更新null属性

    序言:直接调用原生Save方法会导致null属性覆盖到数据库,使用起来十分不方便.本文提供便捷方法解决此问题. 核心思路 如果现在保存某User对象,首先根据主键查询这个User的最新对象,然后将此User对象的非空属性覆盖到最新对象. 核心代码 直接修改通用JpaRepository的实现类,然后在启动类标记此实现类即可. 一.通用CRUD实现类 public class SimpleJpaRepositoryImpl<T, ID> extends SimpleJpaRepository&l

  • springboot使用JPA时间类型进行模糊查询的方法

    这个问题是我自己开发中遇到的问题  数据库使用的是mysql5.6  字段名称为checkingTime  类型为timestamp 显而易见 存到库中的是保留6位毫秒 即yyyy-MM-dd HH:mm:ss.ssssss  此时需求是精确到分钟的相同时间 不进行存储 这时候就需要进行模糊查询   搜了一圈百度 并没有什么好用的方法 我的bean类定义的是date类型 使用注解将类型更改为timestamp 存入库中 其实在做模糊查询的时候  只需要向持久层传入String类型参数即可 我的做

  • Spring Boot 添加MySQL数据库及JPA实例

    最近在学习Spring Boot,继续前面的学习,这一次我们加入MySQL数据库和JPA. 配置: pom.xml文件 <!-- 添加Mysql和JPA--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dep

  • SpringBoot JPA实现增删改查、分页、排序、事务操作等功能示例

    今天给大家介绍一下SpringBoot中JPA的一些常用操作,例如:增删改查.分页.排序.事务操作等功能. 下面先来介绍一下JPA中一些常用的查询操作: //And --- 等价于 SQL 中的 and 关键字,比如 findByHeightAndSex(int height,char sex): public List<User> findByHeightAndSex(int height,char sex); // Or --- 等价于 SQL 中的 or 关键字,比如 findByHei

  • SpringBoot JPA 表关联查询实例

    今天给大家介绍一下如何利用JPA实现表关联查询. 今天给大家举一个一对多的关联查询,并且是使用JPA原生的findBy语句实现的. 例子中总共有两个实体类,一个是Floor(商品楼层类),另一个是FloorContent(商品楼层内容表).下面看两张表的源代码: Floor类: package cms.model; import cms.model.base.BaseDomain; import org.hibernate.annotations.GenericGenerator; import

  • SpringBoot连接MYSQL数据库并使用JPA进行操作

    今天给大家介绍一下如何SpringBoot中连接Mysql数据库,并使用JPA进行数据库的相关操作. 步骤一:在pom.xml文件中添加MYSQl和JPA的相关Jar包依赖,具体添加位置在dependencies中,具体添加的内容如下所示. <!--数据库相关配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-

  • SpringBoot Data JPA 关联表查询的方法

    SpringBoot Data JPA实现 一对多.多对一关联表查询 开发环境 IDEA 2017.1 Java1.8 SpringBoot 2.0 MySQL 5.X 功能需求 通过关联关系查询商店Store中所有的商品Shop,商店对商品一对多,商品对商店多对一,外键 store_id存在于多的一方.使用数据库的内连接语句. 表结构 tb_shop tb_store 实体类,通过注解实现 1.商店类Store.java package com.gaolei.Entity; import ja

随机推荐