Spring Boot 之Spring data JPA简介

JPA的全称是Java Persistence API (JPA),他是一个存储API的标准,而Spring data JPA就是对JPA的一种实现,可以让我们方便的对数据进行存取。按照约定好的方法命名规则写dao层接口,从而在不实现接口的情况下,实现对数据库的访问和操作。同时提供了很多除了CRUD之外的功能,如分页、排序、复杂查询等等。

Spring data JPA可以看做是对Hibernate的二次封装。本文将会以一个具体的例子来讲解,怎么在Spring Boot中使用Spring data JPA。

添加依赖

我们要添加如下的Spring data JPA依赖,为了方便测试,我们添加一个h2的内存数据库:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency> <dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

添加entity bean

我们来创建一个entity bean:

@Entity
@Data
public class Book { @Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id; @Column(nullable = false, unique = true)
private String title; @Column(nullable = false)
private String author;
}

创建 Dao

public interface BookRepository extends JpaRepository<Book, Long> {
List<Book> findByTitle(String title); @Query("SELECT b FROM Book b WHERE LOWER(b.title) = LOWER(:title)")
Book retrieveByTitle(@Param("title") String title);
}

所有的Dao都需要继承Repository接口,Repository是一个空的接口:

@Indexed
public interface Repository<T, ID> { }

如果要使用默认的通用的一些实现,则可以继承CrudRepository, PagingAndSortingRepository和JpaRepository。

上面的例子中我们继承了JpaRepository。

上面的例子中我们创建了一个按Title查找的方法:

List<Book> findByTitle(String title);

这个方法我们是不需要自己去实现的,Spring Data JPA会帮我们去实现。我们可以使用find…By, read…By, query…By, count…By,和 get…By的格式定义查询语句,By后面接的就是Entity的属性。除了And,我们还可以使用Or来拼接方法,下面我们再举个例子:

interface PersonRepository extends Repository<Person, Long> {

  List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);

  // Enables the distinct flag for the query
List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname); // Enabling ignoring case for an individual property
List<Person> findByLastnameIgnoreCase(String lastname);
// Enabling ignoring case for all suitable properties
List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname); // Enabling static ORDER BY for a query
List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
}

当然,处理方法拼接外,我们还可以自定义sql查询语句:

    @Query("SELECT b FROM Book b WHERE LOWER(b.title) = LOWER(:title)")
Book retrieveByTitle(@Param("title") String title);

自定义查询语句给Spring data JPA提供了更大的想象空间。

Spring Data Configuration

要使用Spring Data JPA, 我们还需要在配置文件中指定要扫描的目录,使用@EnableJpaRepositories注解来实现:

@Configuration
@EnableJpaRepositories(basePackages = "com.flydean.repository")
public class PersistenceConfig {
}

我们还需要在配置文件中指定数据源的属性:

spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa

测试

有了上面的一切,我们就可以测试我们的数据源了:

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {JpaApp.class})
public class BookRepositoryTest { @Autowired
private BookRepository bookRepository; @Test
@Transactional(readOnly=false)
public void testBookRepository(){
Book book = new Book();
book.setTitle(randomAlphabetic(10));
book.setAuthor(randomAlphabetic(15)); bookRepository.save(book); bookRepository.findByTitle(book.getTitle()).forEach(e -> log.info(e.toString()));
log.info(bookRepository.retrieveByTitle(book.getTitle()).toString());
}
}

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

更多教程请参考 flydean的博客

Spring Boot 之Spring data JPA简介的更多相关文章

  1. spring boot整合spring Data JPA和freemarker

    1.spring Data JPA简介 是一个替代hibernate的一个作用于数据库的框架. 2.整合 1.导入依赖 <dependency> <groupId>org.sp ...

  2. spring boot系列(五)spring boot 配置spring data jpa (查询方法)

    接着上面spring boot系列(四)spring boot 配置spring data jpa 保存修改方法继续做查询的测试: 1 创建UserInfo实体类,代码和https://www.cnb ...

  3. Spring Boot 整合Spring Data JPA

    Spring Boot整合Spring Data JPA 1)加入依赖 <dependency> <groupId>org.springframework.boot</g ...

  4. Spring Boot 结合Spring Data结合小项目(增,删,查,模糊查询,分页,排序)

    本次做的小项目是类似于,公司发布招聘信息,因此有俩个表,一个公司表,一个招聘信息表,俩个表是一对多的关系 项目整体结构: Spring Boot和Spring Data结合的资源文件 applicat ...

  5. Spring Boot中Spring data注解的使用

    文章目录 Spring Data Annotations @Transactional @NoRepositoryBean @Param @Id @Transient @CreatedBy, @Las ...

  6. Spring Boot 基础,理论,简介

    Spring Boot 基础,理论,简介 1.SpringBoot自动装配 1.1 Spring装配方式 1.2 Spring @Enable 模块驱动 1.3 Spring 条件装配 2.自动装配正 ...

  7. Spring Boot集成Spring Data Reids和Spring Session实现Session共享

    首先,需要先集成Redis的支持,参考:http://www.cnblogs.com/EasonJim/p/7805665.html Spring Boot集成Spring Data Redis+Sp ...

  8. spring boot 集成 Mybatis,JPA

    相对应MyBatis, JPA可能大家会比较陌生,它并不是一个框架,而是一组规范,其使用跟Hibernate 差不多,原理层面的东西就不多讲了,主要的是应用. Mybatis就不多说了,SSM这三个框 ...

  9. 基于Spring Boot和Spring Cloud实现微服务架构学习

    转载自:http://blog.csdn.net/enweitech/article/details/52582918 看了几周Spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习感 ...

随机推荐

  1. CDN加速小水管动态应用技巧

    不得不说现在大陆和HK的云主机都是小水管模式,由于硬件的快速发展在这种小水管的情况下很难发挥出用户硬件资源的能力,当然可以加水管但费用很高,更多时候会浪费带宽:这个时候我们想到CDN加速,这种资源的好 ...

  2. C 电压

      时间限制 : 10000 MS   空间限制 : - KB  评测说明 : 1s,256m 问题描述 JOI社的某个实验室中有着复杂的电路.电路由n个节点和m根细长的电阻组成.节点被标号为1~N ...

  3. 使用Markdown编辑总结

    Markdown是轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档. Markdown可以导出HTML .Word.图像.PDF.Epub 等多种格式的文档. 后缀为.md或者.markdo ...

  4. FastJson反序列化和构造函数之间的一点小秘密

    各位看官大家下午好,FastJson想必大家都很熟悉了,很常见的Json序列化工具.今天在下要和大家分享一波FastJson反序列化和构造函数之间的一点小秘密. 下面先进入大家都深恶痛绝的做题环节.哈 ...

  5. JavaScript基本数据类型及其转换规则

    ECMAScript 数据类型 ECMAScript中有五种基本数据类型:Undefined, Null, Boolean, Number, String 一种复杂数据类型:Object 数据类型检测 ...

  6. Golang入门(2):一天学完GO的基本语法

    摘要 在配置好环境之后,要研究的就是这个语言的语法了.在这篇文章中,作者希望可以简单的介绍一下Golang的各种语法,并与C和Java作一些简单的对比以加深记忆.因为这篇文章只是入门Golang的第二 ...

  7. Thinkphp getLastSql函数用法

    如何判断一个更新操作是否成功: $Model = D('Blog'); $data['id'] = 10; $data['name'] = 'update name'; $result = $Mode ...

  8. Epicor support overview支持服务

    提供以下服务项目: •Support services 支持服务•Implementations 实施•Epicor software upgrades 软件升级•Database support & ...

  9. python CGI 编程实践

    文章更新于:2020-03-05 注1:安装 python 参见: python 的安装使用和基本语法 注2:配置 web 环境参见: Windows&linux使用集成环境搭建 web 服务 ...

  10. problems

    exceptionUnable to connect to userservice.shanmaohuwai.com:80 . Error #0: stream_socket_client(): un ...