JPA是Java Persistence API的简称,是sun公司早期推出的Java持久层规范,目前实现JPA规范的主流框架有Hibernate、OpenJPA等。Hibernate框架是当前较为流行的JPA实现之一,在Spring Data JPA中,默认底层实现也是使用的Hibernate。

目录:

  • Spring Data JPA示例搭建
  • 自定义数据存储逻辑
  • 方法名命名查询

Spring Data JPA示例搭建

Spring Boot 提供了一个"spring-boot-starter-data-jpa"模块,在项目中使用这个模块,就可以简单的整合Spring Data JPA、Hibernate及其他依赖所需模块。

新建一个名为spring-jpa的Maven工程,修改其pom.xml文件。

    <!-- Spring Boot父工程 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.3.RELEASE</version></parent><dependencies><!-- Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Data JPA --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- MySQL 驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency></dependencies>

在src/main/resource目录下新建一个名为application.yml的配置文件:

spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.170.129:3306/spring-jpausername: rootpassword: root

在application.yml配置文件中简单配置了数据库连接必要的参数。从中可以看出,我们项目使用的数据库名:spring-jpa

接下来我们就可以编写项目的数据访问层和业务层了。

实体类Book:

package com.hrvy.entity;@Entity
public class Book {/** 主键ID */@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;/** 图书名称 */@Columnprivate String bookName;/** 图书封面 */@Columnprivate String bookCover;/** 图书作者 */@Columnprivate String bookAuthor;/** 图书价格 */@Columnprivate BigDecimal bookPrice;/** 图书状态:0=false(未删除状态)1=true(已删除状态) */@Columnprivate Boolean isDelete;/** getter/setter 方法。。。 */
}

数据访问接口BookRepository:

package com.hrvy.dao;public interface BookRepository extends JpaRepository<Book, Integer> {}

该接口继承JpaRepository接口,且无任何接口方法和实现类。JpaRepository接口中定义有很多数据访问方法,Spring会默认使用JDK代理来生成BookRepository接口的代理类,从而就拥有了JpaRepository的功能实现,进行数据CRUD操作。

服务层BookService:

package com.hrvy.service;public interface BookService {/*** 获取所有图书信息* * @return*/List<Book> getBooks();/*** 保存图书* * @param book 图书实体*/void saveBook(Book book);
}

package com.hrvy.service.impl;@Service
public class BookServiceImpl implements BookService {@Autowiredprivate BookRepository bookRepository;@Overridepublic List<Book> getBooks() {return bookRepository.findAll();}@Overridepublic void saveBook(Book book) {bookRepository.save(book);}
}

控制层BookController:

package com.hrvy.controller;@RestController
public class BookController {@Autowiredprivate BookService bookService;/*** 获取全部图书* * @return*/@RequestMapping("/getbooks")public List<Book> getBooks() {return bookService.getBooks();}/*** 添加图书* * @return*/@RequestMapping("/addbook")public String AddBook() {Book book = new Book();book.setBookName("Spring Data JPA");book.setBookAuthor("Hrvy");bookService.saveBook(book);return "添加成功";}
}

运行App.java,浏览器输入http://localhost:8080/addbook进行图书添加测试,输入http://localhost:8080/getbooks进行图书查询测试。

自定义数据存储逻辑

Spring帮我们生成的代理类,虽然可以完成很多工作,但在实际应用中,有时仍需要实现我们自己的数据存储逻辑。

新建一个BookRepositoryCustom接口,在BookRepositoryCustom接口中加入需要自定义的接口方法。

BookRepositoryCustom代码如下:

package com.hrvy.dao;public interface BookRepositoryCustom {List<Book> findBooksCustom();
}

修改原来的BookRepository接口,让其同时继承BookRepositoryCustom和JpaRepository。

BookRepository代码如下:

package com.hrvy.dao;public interface BookRepository extends BookRepositoryCustom, JpaRepository<Book, Integer> {}

新建一个名为BookRepositoryCustomImpl的实现类,实现BookRepositoryCustom接口,使用EntityManger接口进行数据操作(该接口具体使用可查看JPA相关文档)。在此特别注意:该实现类的名字必须为BookRepositoryImpl或BookRepositoryCustomImpl,否则Spring会报错。原因:Spring默认会在包下查找名为“BookRepository接口名+Impl”或“BookRepositoryCustom接口名+Impl”的实现类,若查找不到,则会将接口方法findBooksCustom()按命名查询规则来代理生成实现,此时就会抛出以下异常:

org.springframework.data.mapping.PropertyReferenceException: No property findBooksCustom found for type Book!

BookRepositoryCustomImpl代码如下:

package com.hrvy.dao;public class BookRepositoryCustomImpl implements BookRepositoryCustom {@PersistenceContextprivate EntityManager em;@Overridepublic List<Book> findBooksCustom() {StringBuilder sql = new StringBuilder();sql.append("select ");sql.append("* ");// 拼接表字段,这里使用"*"来代替所有字段sql.append("from book ");Query query = em.createNativeQuery(sql.toString(), Book.class);return (List<Book>) query.getResultList();}
}

运行App.java,浏览器输入http://localhost:8080/getbookscustom进行图书查询测试。

方法名命名查询

如果想根据Book的某个字段进行查询,实现类似“from book where book_name = ?”这样的查询,则可以直接在BookRepository接口中定义一个bookName方法(方法名=属性名),代码如下:

package com.hrvy.dao;public interface BookRepository extends BookRepositoryCustom, JpaRepository<Book, Integer> {/** 方法名命名查询:根据bookName获取Book */List<Book> bookName(String bookName);
}

Spring会自动生成相应的查询方法,不需要我们自己编写任何逻辑实现。不仅如此,还可以使用接口的方法名,通过特定的关键字来实现不同的查询功能。例如要查询bookname和bookAuthor等于某值的Book时,则可以使用以下的方法名:

List<Book> findByBookNameAndBookAuthor(String bookName, String bookAuthor);

Spring通过定制方法名来实现相关查询,目前支持20多个关键字,如下表所示:

命名查询关键字
关键字 例子 对于的SQL
And findByNameAndAge where name=? and age=?
Is,Equals findByName, findByNameIs, findByNameEquals where name=?
Between findByAgeBetween where age between ? and ?
LessThan findByAgeLessThan where age<?
...    

转载于:https://www.cnblogs.com/hrvyzou/p/11068724.html

Spring Boot中使用Spring Data JPA示例相关推荐

  1. Spring boot中使用Spring Security的记住我 remember-me功能

    Spring boot中使用Spring Security的记住我 remember-me功能 问题描述:Spring security新手,在登录时加上记住我功能,需要使用框架自带的记住我. 记住的 ...

  2. Spring Boot中使用Spring Security进行安全控制

    我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面.要实现访问控制的方法多种多样,可以通过Aop.拦截器实现,也可以通过框架实现(如:Apache ...

  3. java 方式配置ssm,关于SSM以及Spring boot中对于Spring MVC配置的问题

    SSM中 Spring MVC配置 传统的web.xml配置 web.xml contextConfigLocation classpath*:applicationContext.xml org.s ...

  4. 在 Spring Boot 中使用 Spring AOP 和 AspectJ 来测量方法的执行时间

    原文链接:https://dzone.com/articles/logging-average-method-execution-times-via-aspectj 作者:Murat Derman 译 ...

  5. 在Spring Boot中加载初始化数据

    文章目录 依赖条件 data.sql文件 schema.sql 文件 @sql注解 @SqlConfig 注解 在Spring Boot中加载初始化数据 在Spring Boot中,Spring Bo ...

  6. 第 4-4 课:Spring Boot 中使⽤ Cache 缓存的使⽤

    我们知道绝⼤多数的⽹站/系统,最先遇到的⼀个性能瓶颈就是数据库,使⽤缓存做数据库的前置缓存,可以 ⾮常有效地降低数据库的压⼒,从⽽提升整个系统的响应效率和并发量. 以往使⽤缓存时,通常创建好缓存⼯具类 ...

  7. Spring Boot的Spring Data JPA示例

    1.简介 在本文中,我们将演示如何利用功能强大的Spring Data JPA API与本课程中的数据库(内存中的H2数据库)进行交互. Spring Data JPA提供了一组非常强大且高度抽象的接 ...

  8. Spring Boot(五):spring data jpa的使用

    Spring Boot(五):spring data jpa的使用 一.spring data jpa介绍 1,JPA是什么 JPA(Java Persistence API)是Sun官方提出的Jav ...

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

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

最新文章

  1. 张一鸣:10年面试2000人,我发现混的好的人,全都有同一个特质!
  2. 软件架构设计_给非专业人士介绍——软件架构设计工作
  3. Lambda表达式最佳实践
  4. php遍历子分类的函数,emlog程序获取主分类下的所有子分类ID函数
  5. 循环的中断操作(C#基础回顾03)
  6. centos7安装gitlab7.5.0
  7. PowerBI功能发布时间线
  8. 时间序列-N_LSTM
  9. xp共享文件win7访问时不能保存密码
  10. 自动驾驶 2-2 硬件配置设计 Hardware Configuration Design
  11. could not connect to smtp host java_服务器发送邮件出现Could not connect to SMTP host错误 解决办法...
  12. [zigbee][z-Stack]协议栈简介及工作流程
  13. 数据结构(排序)2021-06-13
  14. PS学习总结三:修图必备的高阶操作
  15. MacOS查看DNS服务器地址
  16. Java获取不到tfp目录内容_AndroidRuntime引起:java.lang.unsatisfiedLinkError:无法加载tfp_jni:findLibrary返回null...
  17. 【Three.js】简单地3D工具-Three.js建模入门基础教程
  18. less模块——math函数
  19. BIM建模助手上线一周,有哪些BUG被用户找到?
  20. 如何在Nintendo 64控制器上更换磨损的模拟棒

热门文章

  1. Linux - #!/bin/bash 和 #!/usr/bin/env bash 的区别
  2. 微信小程序的复制功能
  3. java pdm 解析_java解析静态AIS原始数据
  4. C++ QT调用python脚本并将软件打包发布
  5. 浅谈欧拉定理及其扩展
  6. Hackthebox Three
  7. strcmp函数的C语言实现
  8. Linux比较常用的终端快捷键使用
  9. Content Provider启动浅析
  10. 手机电路板文件_PCB工程师必看,从图纸到成品,电路板的制作只需这三大流程...