Spring Data JPA实践与学习(二)

Spring Data JPA用法详解 Spring Data JPA: JPA(Java Persistence API)即java持久化API,它的出现主要是为了简化持久层开发以及整合ORM技术,结束Hibernate、TopLink、JDO等ORM框架各自为营的局面。JPA是在吸收现有ORM框架的基础上发展而来,易于使用,伸缩性强。总的来说,JPA包括以下三方面的技术: ORM映射元数据:支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系 API:操作实体对象来执行CRUD操作 查询语言:通过面向对象而非面向数据库的 阅读详情

CrudRepository 接口

CrudRepository 为我们提供的方法有:

count(): long 查询总数返回 long 类型;
void delete(T entity) 根据 entity 进行删除;
void deleteAll(Iterable<? extends T> entities) 批量删除;
void deleteAll() 删除所有;
void deleteById(ID id); 根据主键删除,查看源码会发现,其是先查询出来再进行删除;
boolean existsById(ID id) 根据主键判断实体是否存在;
Iterable< T > findAllById(Iterable ids); 根据主键列表查询实体列表;
Iterable< T > findAll(); 查询实体的所有列表;
Optional< T > findById(ID id); 根据主键查询实体,返回 JDK 1.8 的 Optional,这可以避免 null exception;
< S extends T > S save(S entity); 保存实体方法,参数和返回结果可以是实体的子类;
saveAll(Iterable< S > entities) : 批量保存,原理和 save方法相同,我们去看实现的话,就是 for 循环调用上面的 save 方法。

我们需要注意一下 save 和 deleteById 的实现逻辑,分别看看一下这两种方法是怎么实现的:

//新增或者保存

public <S extends T> S save(S entity) {

   if (entityInformation.isNew(entity)) {

      em.persist(entity);

      return entity;

   } else {

      return em.merge(entity);

   }

}

//删除

public void deleteById(ID id) {

   Assert.notNull(id, ID_MUST_NOT_BE_NULL);

   delete(findById(id).orElseThrow(() -> new EmptyResultDataAccessException(

         String.format("No %s entity with id %s exists!", entityInformation.getJavaType(), id), 1)));

}

看上面的源码,会通过 findById 先查询一下实体对象的 ID,然后再去对查询出来的实体对象进行保存操作。而如果在 Delete 的时候,查询到的对象不存在,则直接抛异常。
关于 entityInformation.isNew(entity),如果当传递的参数里面没有 ID,则直接 insert;若当传递的参数里面有 ID,则会触发 select 查询。此方法会去看一下数据库里面是否存在此记录,若存在,则 update,否则 insert。

PagingAndSortingRepository 接口

PagingAndSortingRepository 源码发现有两个方法,分别是用于分页和排序的时候使用的,如下所示:

package org.springframework.data.repository;

import org.springframework.data.domain.Page;

import org.springframework.data.domain.Pageable;

import org.springframework.data.domain.Sort;

@NoRepositoryBean

public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {

	Iterable<T> findAll(Sort sort); (1)

	Page<T> findAll(Pageable pageable); (2)

}

其中,第一个方法 findAll 参数是 Sort,是根据排序参数,实现不同的排序规则获取所有的对象的集合;第二个方法 findAll 参数是 Pageable,是根据分页和排序进行查询,并用 Page 对返回结果进行封装。而 Pageable 对象包含 Page 和 Sort 对象。
PagingAndSortingRepository 使用案例:

public interface UserJpaRepository extends PagingAndSortingRepository<User,Integer> {
}
    @GetMapping(path = "/page")
    @ResponseBody
    public Page<User> getAllUserByPage() {
        return userRepository.findAll(
                PageRequest.of(1, 20, Sort.by(new Sort.Order(Sort.Direction.ASC,"name"))));
    }

    @GetMapping(path = "/sort")
    @ResponseBody
    public Iterable<User> getAllUsersWithSort() {
        return userRepository.findAll(Sort.by(new Sort.Order(Sort.Direction.ASC,"name")));
    }

JpaRepository接口

JpaRepository 是对关系型数据库进行抽象封装,从类图可以看出来它继承 PagingAndSortingRepository 类,也就继承了其所有方法,并且其实现类也是 SimpleJpaRepository。JpaRepository还继承和拥有了 QueryByExampleExecutor 的相关方法。
样例见:Spring Boot集成Spring Data Jpa

Repository 的实现类 SimpleJpaRepository

关系数据库的所有 Repository 接口的实现类就是 SimpleJpaRepository,如果有些业务场景需要进行扩展了,可以继续继承此类。
SimpleJpaRepository 是 Repository 接口、CrudRepository 接口、PagingAndSortingRepository 接口、JpaRepository 接口的实现。其中,SimpleJpaRepository 的部分源码如下:

@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
	private static final String ID_MUST_NOT_BE_NULL = "The given id must not be null!";
	private final JpaEntityInformation<T, ?> entityInformation;
	private final EntityManager em;
	private final PersistenceProvider provider;
	private @Nullable CrudMethodMetadata metadata;
	......
	@Transactional
	public void deleteAllInBatch() {
		em.createQuery(getDeleteAllQueryString()).executeUpdate();
	}
	......

通过此类的源码,我们可以挺清晰地看出 SimpleJpaRepository 的实现机制,是通过 EntityManger 进行实体的操作,而 JpaEntityInforMation 里面存在实体的相关信息和 Crud 方法的元数据等。UserRepository 的实现类是 Spring 启动的时候,利用 Java 动态代理机制帮我们生成的实现类,而真正的实现类就是 SimpleJpaRepository。

JPA & Spring Data JPA详解 JPA & Spring Data JPA 一、JPA 1. JPA是什么 JPA(Java Persistence API)Java持久化 API,是一套基于ORM思想的规范。 ORM(Object Relational Mapping)对象关系映射。实现了实体类对象和数据库中表的一个映射关系。我们可以通过操作实体类对象(JavaBean)来操作数据库表,从而实现数据库的CRUD操作并且不需要去重点关注SQL语句。ORM主要涉及到两个映射关系:1、实体类和表的映射关系;2、实体类中的属性和表中的字 阅读详情

相关推荐

Spring Data JPA与Mybatis的对比

我们再看看hibernate的官方概念,Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。完成以上步骤,基本上完成了体统中主要的业务概念类和表结构的设计工作,只是完成表结构设计的出发点事如何持久化系统的对象,同时兼顾数据库表、字段、字段类型、表的关联关系的合理性和合规性,而不是单纯表设计。.

JavaMonsterr的博客 4397

spring data jpa入门教程

文章目录配置文件编写实体类并创建好对应数据库编写对应Dao类Repository常用方法使用规范@query注解的使用使用Spring Data进行删除更新操作 配置文件 首先要在pom中引入相关依赖 <!-- spring-data-jpa --> <dependency> <groupId>org.springframework.data&lt...

qq_24095055的博客 1119

Spring源码学习-spring data jpa源码分析

我先从spring project的git上下载了Spring的源码 Spring data jpa的源码在Spring project的spring-orm/src/main/java/org/springframework/orm/jpa里 这是jpa文件夹结构 最基础的一个接口是org.springframework.data.repository.Re

Benson的博客 3652

Spring Data JPA 的JpaRepository

除了提供的内置方法,你还可以在接口中定义自定义查询方法,Spring Data JPA 会根据方法名称自动生成查询。// 自定义方法:通过用户名查找用户// 自定义方法:通过邮箱查找用户是一个非常强大的接口,能够简化很多数据库操作。通过它,你可以轻松地完成对数据库的增删改查,并且可以自定义查询方法,极大地提升了开发效率。

weixin_46038239的博客 1171

Hibernate与Spring Data JPA的区别

在Java开发中,数据持久化是一个重要的环节。为了简化数据库操作,降低与数据库交互的复杂度,出现了多种持久化技术和框架。JPA(Java Persistence API)是Java提供的一种用于管理关系型数据的规范,它定义了一套标准的API和注解,如@Entity@Table@Id等,但本身并不提供具体实现。Hibernate和Spring Data JPA都是围绕JPA发展而来的技术。

qq_29715355的博客 957

SpringBoot中Mybatis跟Spring Data JPA区别在哪?

我觉得为啥这么多人都说Mybatis好,原因最主要是Mybatis容易上手,现在学编程学数据库基本都学过SQL,Mybatis面向DB基于SQL的模式相对来说就显得特别直观友好。 而JPA是基于ORM的,把代码和DB分离,相当于在代码和DB之间增加了一个新的层面,一套新的标准,去间接操作DB,相对SQL的模式来说就显得不够直接和易于控制,增加了学习成本,碰到这样那样问题的时候,很容易让人放弃。 特别是在团队开发的时候,你很难掌控每个人对JPA的深层机制的理解程度,为了避免木桶效应,还不如干脆都用Myba.

大仙 3868

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

SpringDataJpa开发--继承JpaRepository实现简单条件查询

1.Spring Data JPA 是 Spring Data 技术下的子项目,使用Spring Data JPA 访问数据只需要数据访问层接口实现JpaRepository接口即可。 2.JpaRepository接口继承了PagingAndSortingRepository接口,所以也有它的一些功能 3.JpaRepoditory接口提供了很多常用方法:   示例:简单条件查询 ...

BADAO_LIUMANG_QIZHI的博客 9935

spring data jpa使用详解

使用Spring data JPA开发已经有一段时间了,这期间学习了一些东西,也遇到了一些问题,在这里和大家分享一下。 前言: Spring data简介: Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。 Spring Data 包含多个子项目: Commons - 提供共享

牛奋lch 5万+

SpringData核心数据访问接口--CrudRepository示例

1.Spring Data JPA可以极大地简化JPA的写法,在几乎不用写接口实现的情况下完成对数据的访问和操作。 2.Spring Data通过提供Repository接口来约定数据访问的统一标准。 3.Repository接口下包含一些常用的子接口:    CrudRepository、PagingAndSortingRepository、JpaRepository 4.在进行spri...

BADAO_LIUMANG_QIZHI的博客 4491

TPC好像是这么回事儿

TPC(Transmit Power Control)发送功率控制,本觉得就是控制一下发送功率,原理很简单,但看原版协议死活每搞懂什么意思,恼羞成怒!!!! 后来又看了一些贴子和cisco的相关功能介绍,再回头看协议,好像是这么一回事: 1、所谓TPC,是AP控制STA的发送功率的一种手段。在802.11d中,已定义了使用Country Element传递区域无线通信规定的信道和最大发送功率信息: 通过获取这些信息,STA可以确定自己应该遵守什么规则,可以用什么发送功率在哪些信道上通信。 2

两只勤劳的蜜蜂 8625

谈hibernate,jpa与spring data jpa三者之间的关系

前提 其实很多框架都是对另一个框架的封装,我们在学习类似的框架的时候,难免会进入误区,所以我们就应该对其进行总结归纳,对比。 本文就是对hibernate,jpa,spring data jpa三者之间进行文字对比,以及对其三者分别进行CRUD操作。 文字说明 Hibernate Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建...

qq_41300350的博客 1万+

Canoe Panel基础功能介绍

CANoe Panel 是 Vector CANoe 软件中用于设计图形化操作界面的功能模块。用户可以在面板上添加合适的控件,实时的改变信号或者变量的值

m0_56208280的博客 1948

Spring Data JPA详解

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

JAVA_KX的博客 3289

STM32—时钟树(结合系统时钟函数理解)

时钟树的概念: 我们可以把MCU的运行比作人体的运行一样,人最重要的是什么?是心跳! 心脏的周期性收缩将血液泵向身体各处。心脏对于人体好比时钟对于MCU,微控制器(MCU)的运行要靠周期性的时钟脉冲来驱动,而这个脉冲的始源往往是由外部晶体振荡器提供时钟输入,最终转换为多个外部设备的周期性运作。这种时钟“能量”的传递路径犹如大树的养分由主干流向个分支,因此称为时钟树。 STM32时钟: 在STM32...

肥宅快乐博客 1万+

深入解析Mifare Classic Crypto1认证流程与密钥交换机制

本文深入解析Mifare Classic Crypto1认证流程与密钥交换机制,详细介绍了Crypto1加密算法的工作原理、认证初始化阶段、随机数交换与密钥流生成过程,以及双向验证步骤。文章还分析了Mifare Classic的安全漏洞,包括随机数生成缺陷和密钥流恢复攻击,并提供了Proxmark3实战演示和防护建议。

c6d7e8f9g的博客 898

Spring Data JPA

快速入门spring data jpa,并且集成到Springboot

llg3189609554的博客 1431

基于Windows环境的OGG远程抽取异常(经典模式)OGG-02830 Formatting error

MOS提供的解决方法,根据MOS的提示是由于使用的OGG版本太新了,经典模式下已经弃用了这种远程抽取方式。问题:Windows环境下启用远程抽取ADG备库的数据,在启动抽取进程的时候出现如下错误提示。

Mrzhou的博客 378

Spring Data JPA全面指南

摘要: Spring Data JPA作为JPA规范的实现框架,通过简化配置和自动化操作提升开发效率。其核心功能包括: 声明式Repository:通过继承CrudRepository/JpaRepository接口,无需实现即可自动生成CRUD方法; 查询派生:基于方法名(如findByEmail)自动生成SQL查询,支持排序、分页等; 审计与事务:通过注解自动维护创建/修改时间,并集成声明式事务管理; 关联映射:简化实体关系配置(如@OneToMany),支持JSON序列化控制; 扩展性:允许自定义Re

静水深流 1505

如何提高电路的抗干扰能力

本内容详细介绍了电源传导干扰处理,包括滤波、Feedthrough电容器、磁环、磁珠、屏蔽的使用与选型,EMC电磁兼容测试项目简介与要求,单片机与电源抗干扰处理等。

让你爱上电路设计 8593

prplOS介绍

介绍prplOS是什么,特性、框架、编译等。

四儿家的小祖宗的博客 2119

Spring 加强版 ORM 框架 spring-data-jpa 入门与实践

伴随着 Java 诞生与发展,目前 Java 界涌现出了五花八门的数据访问技术,有一些名词甚至达到了耳熟能详的程度,包括 JDBC、JTA、JPA、ORM、MyBatis 等等,这篇介绍的是 Spring Data 项目中的 spring-data-jpa 框架,了解其他相关技术可以查阅我前面的文章。......

大鹏的博客 3456

PCL RANSAC拟合直线并插值

空间直线线性插值的原理与实现方法。

点云侠的博客 136

【JAVA】Spring Data JPA

Spring Data JPA

weixin_37559642的博客 1106

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

Spring Boot整合Spring Data JPA

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

daqi1983的博客 1590

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

上一篇: 2020-11-19 问题记录
下一篇: Spring Data JPA实践与学习(三)
CodersCoder
博客等级 码龄10年 90粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值