Spring Boot 实例:整合 Spring Data JPA

解析JPA 仓库repository中的findAll()方法 1.源码 Page<T> findAll(@Nullable Specification<T> spec, Pageable pageable); (1) Specification spec 对象 (2) Pageable pageable 对象 下面是findAll()实现类 public Page<T> findAll(@Nullable Specifi... 阅读详情

  • 首先 JPA(Java Persistence API)和Spring Data是两个范畴的概念, JPA
    和Hibernate的关系就像JDBC
    域JDBC驱动的关系,即JPA制定了ORM规范,Hibernate是这些规范的实现,因此从功能上来讲JPA相当于Hibernate的一个子集
  • Spring Data是Spring 的一个子项目,致力于简化数据库的访问,通过规范的方法名来分析开发者的意图,本实例步骤如下:

step.1

创建数据库jpa:

CREATE DATABASE `jpa` CHARACTER SET 'utf8';

step.2

创建spring boot 项目,添加mysql 和spring data jpa 的倚赖:

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.1.9</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

step.3

数据库配置:

  • 在application.properties中配置数据库的基本信息以及jpa相关配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql:///jpa?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.show-sql=true
spring.jpa.database=mysql
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
  • 1~4行是数据库基本信息
  • 第5行表示是否在控制台打印jpa执行过程生成的sql
  • 第6行表示jpa对应的数据库是mysql
  • 第7行表示在项目启动时根据实体类更新数据库中的表

step.4

创建实体类Book:

@Entity(name = "t_book")
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(name = "book_name",nullable = false)
    private String name;
    private String author;
    private Float price;
    @Transient
    private String description;
    //省略getter/setter

  • @Entity注解表示该类是一个实体类,项目启动时会自动创建一张表,表的名称就是后面name的值,如果没有定义name,那么表名将默认使用类名
  • @Id 表示主键,GeneratedValue表示主键自动生成,strategy 表示生成策略
  • @Column表示注解可以定制字段的属性
  • @Transient表示自动生成表时忽略改字段

step.5

创建BookDao接口,继承JpaRepository

public interface BookDao extends JpaRepository<Book,Integer>{
    List<Book> getBooksByAuthorStartingWith(String author);
    List<Book> getBooksByPriceGreaterThan(Float price);
    @Query(value = "select * from t_book where id=(select max(id) from t_book)",nativeQuery = true)
    Book getMaxIdBook();
    @Query("select b from t_book b where b.id=:id and b.author=:author")
    List<Book> getBookByIdAndAuthor(@Param("author") String author, @Param("id") Integer id);
    @Query("select b from t_book b where b.id=?2 and b.name like %?1%")
    List<Book> getBooksByIdAndName(String name, Integer id);
}

解释如下:

  • 自定义BookDao 继承JpaRepository,其中JpaRepository中已经提供了一些基本的如增删改查的基本数据操作方法
  • 第二行定义的方法表示查询以某个字符开始的所有书
  • 第三行定义的方法表示查询单价大于某个值的所有书
  • 在Spring Data Jpa中只要方法的定义符合规范,就是一定的方法命名规则,支持的命名规则如下表所示:
KeyWords方法命名举例对应的SQL
AndfindByNameAndAgewhere name = ? and age = ?
OrfindByNameOrAgewhere name = ? or age = ?
IsfindByAgeIswhere age = ?
EqualsfindByIdEqualswhere id=?
BetweenfindByAgeBetweenwhere age between ? and ?
LessThanfindByAgeLessThanwhere age <?
GreaterThanfindByAgeGreaterThanwhere age >?
GreaterThanEqualsfindByAgeGreaterThanEqualswhere age >=?
LessThanEqualsfindByAgeLessThanEqualswhere age <=?
AfterfindByAgeAfterwhere age >?
BeforefindByAgeBeforewhere age <?
IsNullfindByNameIsNullwhere name is null
isNotNull,NotNUllfindByNameNotNullwhere name is not null
NotfindByGenderNotwhere gender <>?
NotInfindByAgeNotInwhere age not in (?)
NotLikefindByNameNotLikewhere name not like ?
LikefindByNameLikewhere name like ?
StartingWithfindByNameStartingWithwhere name like ‘?%’
EndingWithfindByNameEndingWithwhere name like ‘%?’
Containing,ContainsfindByNameContainingwhere name like ‘?%?’
OrderByfindByAgeGreaterThanOrderByIdDescwhere age >? order by id desc
TruefindByEnabledTruewhere enabled =true
FalsefindByEnabledFalsewhere enabled =false
IgnoreCasefindByNameIgnoreCasewhere UPPER(name)=UPPER(?)
  • 既定的方法名不一定能满足所有的开发需求,因此Spring Data JPA 也支持自定义JPQL (java persistence query language)或者原生sql,第4~6行表示查询id最大的书,nativeQuery = true表示使用原生的sql查询
  • 第7~9行表示根据id和author进行查询,这里使用默认的JPQL进行查询,通过类名和属性名进行访问,而不是通过表明和表的属性,使用:id,:name进行参数绑定,需要注意的是这里使用的列名是属性的名称而不是数据库中列的名称
  • 第10,11行也是自定义JPQL查询,不同的是传参方式使用?1,?这种方式
  • 如果BokDao中涉及修改操作,则需要添加@Modifying注解并添加事务。

Step. 6

创建BookService:

@Service
public class BookService {
    @Autowired
    BookDao bookDao;
    public void addBook(Book book) {
        bookDao.save(book);
    }
    public Page<Book> getBookByPage(Pageable pageable) {
        return bookDao.findAll(pageable);
    }
    public List<Book> getBooksByAuthorStartingWith(String author){
        return bookDao.getBooksByAuthorStartingWith(author);
    }
    public List<Book> getBooksByPriceGreaterThan(Float price){
        return bookDao.getBooksByPriceGreaterThan(price);
    }
    public Book getMaxIdBook(){
        return bookDao.getMaxIdBook();
    }
    public List<Book> getBookByIdAndAuthor(String author, Integer id){
        return bookDao.getBookByIdAndAuthor(author, id);
    }
    public List<Book> getBooksByIdAndName(String name, Integer id){
        return bookDao.getBooksByIdAndName(name, id);
    }
}
  • 其中第六行的save方法建对象数据保存到数据库save方法是由JpaRepository接口提供的
  • 第九行是一个分页查询,fandAll方法的返回值是Page< Book>

step.7

创建BookController:

@RestController
public class BookController {
    @Autowired
    BookService bookService;
    @GetMapping("/findAll")
    public void findAll() {
        PageRequest pageable = PageRequest.of(2, 3);
        Page<Book> page = bookService.getBookByPage(pageable);
        System.out.println("总页数:"+page.getTotalPages());
        System.out.println("总记录数:"+page.getTotalElements());
        System.out.println("查询结果:"+page.getContent());
        System.out.println("当前页数:"+(page.getNumber()+1));
        System.out.println("当前页记录数:"+page.getNumberOfElements());
        System.out.println("每页记录数:"+page.getSize());
    }
    @GetMapping("/search")
    public void search() {
        List<Book> bs1 = bookService.getBookByIdAndAuthor("鲁迅", 7);
        List<Book> bs2 = bookService.getBooksByAuthorStartingWith("吴");
        List<Book> bs3 = bookService.getBooksByIdAndName("西", 8);
        List<Book> bs4 = bookService.getBooksByPriceGreaterThan(30F);
        Book b = bookService.getMaxIdBook();
        System.out.println("bs1:"+bs1);
        System.out.println("bs2:"+bs2);
        System.out.println("bs3:"+bs3);
        System.out.println("bs4:"+bs4);
        System.out.println("b:"+b);
    }
    @GetMapping("/save")
    public void save() {
        Book book = new Book();
        book.setAuthor("鲁迅");
        book.setName("呐喊");
        book.setPrice(23F);
        bookService.addBook(book);
    }
}

  • 在findAll中首先需要调用PageRequest 中的of方法构造PageRequest
    对象,of方法接受两个参数,第一个是页数,从0开始,第二个是每页显示的条数
  • 在save接口中构造一个Book对象,直接调用save方法进行保存

step.8

测试:
加入数据
在这里插入图片描述

  1. 输入http://localhost:8080/findAll,结果如下
总页数:2
总记录数:4
查询结果:[Book{id=1, name='三国演义', author='罗贯中', price=99.0, description='null'}, Book{id=2, name='西游记', author='六小龄童', price=999.0, description='null'}, Book{id=3, name='鸡你太美', author='cxk', price=9999.0, description='null'}]
当前页数:1
当前页记录数:3
每页记录数:3

  1. 接下来调用http://localhost:8080/save接口,调用后数据更新如图:
    在这里插入图片描述
  2. 接下来调用http://localhost:8080/search 接口,查询结果如下:
bs1:[Book{id=3, name='鸡你太美', author='cxk', price=9999.0, description='null'}]
bs2:[Book{id=6, name='呐喊', author='鲁迅', price=23.0, description='null'}]
bs3:[Book{id=2, name='西游记', author='六小龄童', price=999.0, description='null'}]
bs4:[Book{id=1, name='三国演义', author='罗贯中', price=99.0, description='null'}, Book{id=2, name='西游记', author='六小龄童', price=999.0, description='null'}, Book{id=3, name='鸡你太美', author='cxk', price=9999.0, description='null'}, Book{id=6, name='呐喊', author='鲁迅', price=23.0, description='null'}]
b:Book{id=6, name='呐喊', author='鲁迅', price=23.0, description='null'}

注意:其中数据源的不同可能会导致查询不到结果等问题,可在BookDao中自行改动数据库语句

实例结构

在这里插入图片描述

Spring Boot整合Spring Data JPA详解 Spring Boot整合Spring Data JPA理解 官方文档: Spring Data JPA 官方文档 一、 Sping Data JPA 简介 在此之前我们首先来认识一下,**Spring Data JPA** 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的JPA 应用框架,底层使用了 Hibernate 的 JPA 技术实现,Spring Data JP... 阅读详情

相关推荐

Java框架_SpringBoot整合Spring Data JPA

111

邻家丶乖乖女的专栏 4515

SpringBoot 一文搞懂Spring JPA

一文搞懂Spring JPA 什么是 JPA spirng data jpa是spring提供的一套简化JPA开发的框架,按照约定好的【方法命名规则】写dao层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。同时提供了很多除了CRUD之外的功能,如分页、排序、复杂查询等等。 Spring Data JPA 可以理解为 JPA 规范的再次封装抽象,底层还是使用了 Hibernate 的 JPA 技术实现。 Springboot整合SpringData JPA SpringData简介 整合Sp

matafeiyanll的博客 1万+

【Spring Boot】SpringBoot和数据库交互: 使用Spring Data JPA

在本博客中,我们详细探索了Spring Data JPA在Spring Boot中的应用。从传统数据库交互到现代化的JPA方式,再到实体的创建、数据访问和事务管理,每一步都进行了深入解析。通过实际案例,明确展示了从建模到数据访问的全流程。同时,也针对常见问题,如N+1查询,给出了解决建议。此文旨在帮助开发者更有效地利用Spring Data JPA,简化数据库操作,提高开发效率。

Ricky的博客 4920

SpringBoot整合JPA

SpringBoot整合JPA

YIYIYI 1万+

Idea创建spring boot 项目(4)整合Spring Data Jpa

接博客---&gt; Idea创建spring boot 项目(3)集成Lombok使用工具:    IDE:idea 2017.2.6    Spirng boot:1.5.9    Swagger版本:2.7.0    Lombok版本:1.16.20        MySql版本:6.0.6        数据库连接池:HikariCP 2.7.71、添加依赖:    打开项目build.g...

SAM_XIE_52的博客 3195

Spring Boot示例 - 2. 使用Spring Boot + Spring Data REST + Spring Data JPA构建符合HATEOAS规范的REST应用

一、概述一般使用Spring MVC + Spring Data JPA即可构建REST服务,但是这种方式要完整实现Controller层,Service层和Repository层,需要编写很多样板代码,诸如注释,XML配置等。 使用Spring Data REST可以轻松构建超媒体驱动(hypermedia-driven)的REST服务。 Spring Data REST本身是个Spring

qiutongyeluo的专栏 8400

SpringBoot集成JPA及基本使用

本篇从JDBC、ORM、JPA、Spring Data JPA说起,分享了SpringBoot集成JPA的实现、Repository的命名规则以及InvalidDefinitionException异常的处理

JingAi_jia917的博客 5557

spring boot与cassandra集成,使用JPA方式。

spring boot与cassandra集成,使用JPA方式。

springboot整合jpa,步骤详细(图文结合讲解)

编译器Intellij IDEA 关系型数据库MySql 5.7 对象关系映射框架JPA 首先新建springboot工程,取名为springbootjpa,设置好java版本后点击next

weixin_43442127的博客 3万+

Ubuntu 20.04 + CARLA 0.9.13 长时运行崩溃?手把手教你定位和缓解Segmentation fault

本文详细解析了Ubuntu 20.04环境下CARLA 0.9.13仿真平台长时运行崩溃问题,提供了从内存监控到核心转储分析的系统级诊断方法,并分享内存泄漏缓解、稳定性优化配置等实用解决方案,帮助开发者构建更稳定的自动驾驶仿真环境。

weixin_28362173的博客 252

Java Web开发进阶——Spring Boot与Spring Data JPA

Spring Data JPA 是 Spring Data 项目中的子项目,旨在简化与 JPA(Java Persistence API)的集成。它在标准 JPA 的基础上提供了更高层次的抽象,开发者可以使用极少的代码实现复杂的数据操作。Spring Data JPA 是 Spring 提供的一种面向数据访问的持久化框架,它简化了 JPA 的实现,为开发者提供了一种快速操作数据库的方式。Spring Data JPA 的强大之处在于其灵活的查询方式,支持方法派生、JPQL 和原生 SQL。

好看资源网的博客 2243

Materials Studio多层聚合物建模全流程:从Build Layers到LAMMPS data文件导出避坑指南

本文详细解析了使用Materials Studio构建多层聚合物模型并导出为LAMMPS data文件的全流程。重点剖析了Build Layers工具的核心逻辑、真空层处理技巧,并提供了解决导出过程中Z轴坐标偏移问题的实战方案,特别是如何利用msi2lmp工具的-shift参数进行精准校正,确保模型在LAMMPS中模拟的稳定性和准确性。

hhh00的博客 913

Spring Boot整合Spring Data JPA

Spring Data中按照框架的规范自定义了Repository接口,除了可以使用接口提供的默认方法外,还可以按特定规则来定义查询方法,只要这些查询方法的方法名遵守特定的规则,不需要提供方法实现体,Spring Data就会自动为这些方法生成查询语句。Spring Data对这种特定的查询方法的定义规范如下:以find、read、get、query、count开头。涉及查询条件时,条件的属性使用条件关键字连接,并且条件属性的首字母大写。

daqi1983的博客 1590

Docker新手必看:解决‘Unable to find image’错误的完整指南

本文针对Docker新手常见的‘Unable to find image’错误,提供了完整的排查与解决指南。文章深入剖析了权限不足、网络连接失败、Docker服务未运行等核心原因,并给出了将用户加入docker组、配置镜像加速器等实用解决方案,帮助读者彻底理解并解决镜像拉取问题。

weixin_29230901的博客 241

pcb印刷电路缺陷检测----数据集准备

PKU-Market-PCB 印刷电路板 (PCB) 瑕疵数据集是一个公共合成 PCB 数据集,包含 1,386 张图像,具有 6 种缺陷(漏孔、鼠咬、开路、短路、杂散、杂铜),可用于图像检测、分类和配准任务。

qq_30190551的博客 4425

06 Spring Boot整合 Spring Data JPA

JPA (Java Persistence API) : 是Sun 官方提出的Java 持久化规范。Spring Data JPA 是Spring Data 的一个子项目,通过提供基于JPA 的Respository极大地减少了JPA 作为数据访问方案的代码量。 通过Spring Data JPA 框架, 开发者可以省略实现持久层业务逻辑的工作,唯一要做的就是声明持久层的接口,其他都交给Spri...

数据知道的博客 2万+

UI自动化控制PC端微信获取当前群聊的群友列表

在一个月前,某个群友在获取整个群的群友信息时遇到了一点问题: 对整个群进行群友数据获取经测试确实有点棘手,下面我将我的解决过程公布给大家。 基础教程详见: https://blog.youkuaiyun.com/as604049322/article/details/121391639 人工打开要抓取的群聊窗口后,首先获取微信窗口并点击聊天信息按钮: import uiautomation as auto auto.uiautomation.SetGlobalSearchTimeout(1) wechatWind

小小明-代码实体的专栏 3万+

Spring Boot 整合 Spring Data JPA、strategy 的策略区别、什么是 Spring Data JPA

Spring Boot 整合 Spring Data JPA、strategy 的策略区别、什么是 Spring Data JPA

hutao8896的博客 1113

红绿灯背后的数学:如何用Java算出“黄金绿灯时间“?

本文探讨了城市交通信号灯配时优化的数学原理与Java实现方法。文章首先分析了信号灯配时不合理导致的交通问题,指出精确计算绿灯时长的重要性。核心内容包括:1)基于M/M/1排队模型建立车流量数学模型,通过优化算法最小化总等待时间;2)使用Java实现信号灯优化控制器,采用梯度下降法动态调整绿灯时长。文中提供了完整的Java代码实现,包括信号灯控制器基类和优化控制器类,采用原子类保证线程安全,并详细解释了关键算法原理和实现细节。该方案可为城市智能交通系统提供理论支持和技术实现参考。

墨夶的博客 1345

57、振荡扫描仪的挠性枢轴:原理、设计与材料选择

本文深入探讨了振荡扫描仪中挠性枢轴的工作原理、设计方法与材料选择。挠性枢轴因其无润滑、高精度、低周期性误差和潜在无限寿命等优势,广泛应用于光学、太空、医学和半导体等领域。文章分析了其在小角度下的优异性能与无法连续旋转等局限性,提供了关键设计公式,并对比了多种挠性材料的性能指标。同时,结合不同应用场景提出设计优化策略,并展望了微型化、智能化和高性能材料等未来发展趋势,为工程实践提供了系统的设计流程与选型建议。

numpy6sculptor的博客 95

Spring Boot数据访问——整合Spring Data JPA篇!超详细!

Spring Data JPA 提供了很多模板代码,易于扩展,可以大幅提高开发效率,使开发者用极简的代码即可实现对数据的访问。基于SpringDataJPA的规范可以提升数据访问层的开发效率和灵活性,开发人员在使用 Spring Data JPA 时,应基于 Spring Data JPA 的规范同时也需要遵守团队的代码规范和风格,保证代码清晰易读,从而开发高质量的程序。

元气满满的霄霄滴博客 2744

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Spring Boot 整合 Spring Data JPA(JpaRepository)

Spring Boot 整合 Spring Data JPA 一、概念: spring data:spring data 是 spring提供的一个操作数据库的框架。而 spring data jpa 只是 spring data 框架下的一个基于 JPA 标准(规范)的操作数据库的模块。 spring data jpa:基于JPA 的标准 对数据进行操作。简化操作持久层的代码。只需要编写接口就...

dh_sheep的博客 998

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Spring Data JPA详解

Spring Data是持久层通用解决方案,支持关系型数据库 Oracle、MySQL、非关系型数据库NoSQL、Map-Reduce 框架、云基础数据服务 、搜索服务等。

JAVA_KX的博客 3289

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spring boot整合JPA:添加spring-boot-starter-data-jpa 依赖报错 解决方法

在Spring boot整合JPA的时候,在网上查询添加的依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> ...

Lfanmujin的博客 1万+

Spring Boot下的Spring Data JPA实战详解

1.点睛Spring Data JPA(1).什么名字是Spring Data JPA Spring Data JPA是Spring基于Hibernate开发的一个JPA框架,Spring Data JPA是Spring Data的一个子项目,它通过提供基于JPA的Repository极大地减少了JPA作为数据访问方案的代码量,也就是xml不需要再写很多常规的sql代码了。(2).定义数据访问层

c136547731的博客 2809
上一篇: Spring实例:在xml中引入(配置)文件
下一篇: Vmware workstation与Hyper-v不兼容的解决方法
金心靖晨
博客等级 码龄9年 460粉丝 211原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值