Spring Data JPA渐进式学习--Repostory

无人自行车平衡控制:最小二乘法动态零点拟合实践 本文探讨了无人自行车平衡控制中动态零点的重要性及实现方法。通过最小二乘法拟合车头角度与ROL值的线性关系,解决了固定零点在转向时导致的稳定性问题。实践表明,动态零点拟合能显著提升系统平衡稳定性并降低能耗。 阅读详情

源码

这就是Repostory的源码,里边没有任何方法。

package org.springframework.data.repository;

import org.springframework.stereotype.Indexed;

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

但是只要继承了这个类,就可以实现JPA的一些默认实现方法。

Repostory类层次关系

从层级关系可以看出来分了四大类,下边简单介绍一下。

ReactiveCrudRepository

这个是响应式编程的一个类,主要支持NoSQL方面的操作。目前主要支持了Cassandra,MongoDB,Redis的实现。

RxJava2CrudRepository

这个是为了支持RxJava2做的标准响应式编程的接口。

CoroutineCrudRepository

这个是为了支持Kotlin语法而增加的

CrudRepository

这个则是我学习的重点

我们再看一下Repository的类层级关系图:我把类的作用标注了一下。

Repostory接口

这个接口没有默认方法,也就是说,我们增加了什么方法,就可以使用什么方法。

public interface UserRepository extends Repository<UserInfo,Integer> {
    List<UserInfo> findByName(String name);
    List<UserInfo> findByAgeAndName(Integer age, String name);
}

当我们添加了两个方法如上代码所示,一个根据name找user,一个根据age和name找用户。

这时,之前写的save和findAll方法就报错了,因为这里边没有这两个方法。

UserRepository实例通过继承Repository,使Spring容器知道UserRepository是操作数据库的类,并可以对数据库进行CRUD操作。

CrudRepository接口

我们将每个方法的作用用注解进行标注,以便更直观的查看。

@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
    //保存
    <S extends T> S save(S var1);
    //批量保存
    <S extends T> Iterable<S> saveAll(Iterable<S> var1);
    //根据主键查询
    Optional<T> findById(ID var1);
    //根据主键查询是否存在
    boolean existsById(ID var1);
    //查询所有实体的列表
    Iterable<T> findAll();
    //根据主键的list列表查询所有实体
    Iterable<T> findAllById(Iterable<ID> var1);
    //查询总数
    long count();
    //根据主键删除
    void deleteById(ID var1);
    //根据实体类对象删除
    void delete(T var1);
    //根据主键的List删除所有
    void deleteAll(Iterable<? extends T> var1);
    //根据主键删除
    void deleteAll();
}

以上这些方法就是CrudRepository对外暴露的最常见的接口,当我们的UserRepository继承CrudRepository之后,我们就可以使用这些方法操作我们的UserInfo表了。

这里我们特别看一些save和delete方法

<S extends T> S save(S var1);

从源码可以看出,会先判断是否是新的数据,若是新的则新增,若是已有的则修改已有数据。

@Transactional
public <S extends T> S save(S entity) {
    if (this.entityInformation.isNew(entity)) {
        this.em.persist(entity);
        return entity;
    } else {
        return this.em.merge(entity);
    }
}

<S extends T> Iterable<S> saveAll(Iterable<S> var1);

这里可以看出,尽管是saveAll()但也是轮询然后一个一个调save方法保存的,并没有性能上的提升。

@Transactional
public <S extends T> List<S> saveAll(Iterable<S> entities) {
    Assert.notNull(entities, "Entities must not be null!");
    List<S> result = new ArrayList();
    Iterator var3 = entities.iterator();

    while(var3.hasNext()) {
        S entity = var3.next();
        result.add(this.save(entity));
    }

    return result;
}

void deleteById(ID var1);

delete方法则是先判断了传入的实体是否存在,若是不存在还抛出了错误。

@Transactional
public void deleteById(ID id) {
    Assert.notNull(id, "The given id must not be null!");
    this.delete(this.findById(id).orElseThrow(() -> {
        return new EmptyResultDataAccessException(String.format("No %s entity with id %s exists!", this.entityInformation.getJavaType(), id), 1);
    }));
}

PagingAndSortingRepository接口

这个接口继承自CrudRepository,然后添加了主要用于分页查询和排序查询的两个方法。

源码如下:

@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
    //排序查询
    Iterable<T> findAll(Sort var1);
    //分页查询
    Page<T> findAll(Pageable var1);
}

这个接口只有两个方法,分别当排序和分页的时候使用。

使用的时候,直接让我们的UserRepository继承PagingAndSortingRepository即可。

public interface UserRepository extends PagingAndSortingRepository<UserInfo,Integer> {

}

这时查询的时候,就可以使用分页和排序了

分页

这段代码的意思是,取第一页,每页20个数据,根据name排序。

@GetMapping(path = "users")
@ResponseBody
@WebLog(printResult = true)
public Page<UserInfo> getAllUsers(){
    return userRepository.findAll(PageRequest.of(1,20, Sort.by(new Sort.Order(Sort.Direction.ASC,"name"))));
}

排序

这则是根据name字段逆序排序

@GetMapping(path = "users")
@ResponseBody
@WebLog(printResult = true)
public Iterable<UserInfo> getAllUsers(){
    return userRepository.findAll(Sort.by(new Sort.Order(Sort.Direction.DESC,"name")));
}
银行会计第2课:交易和核算分离的思想 核算作为会计的基础,将交易转化为可量化的信息,而会计则通过整合核算结果,实现对经济活动的全面把控。- 本质:指企业或主体之间发生的、能引起经济利益变动的具体事项,比如采购商品、销售货物、支付工资等,是客观发生的经济事实。可售产品(业务视角的核算对象) + 属性条件(核算的分类,限制等) = 核算类型(会计视角,含有科目分类内容)- 核算:会计人员根据采购发票、入库单等,将这笔交易记为“借:原材料,贷:银行存款”(对事实的会计处理)。- 特点:是核算的源头,不涉及会计处理,仅代表经济行为的发生。 阅读详情

相关推荐

MOSFET导通电阻Rdson全解析:物理组成、公式推导与工程选型要点

在功率电子设计中,MOSFET作为核心开关器件,其导通电阻Rdson直接决定导通损耗与系统效率。从半导体物理角度看,Rdson并非单一固定值,而是由源极电阻、沟道电阻、累积层电阻、JFET区电阻、漂移区电阻及衬底电阻等多个分量串联而成,并随栅极驱动电压、结温以及击穿电压等级发生显著变化。理解Rdson的物理来源与数学表达,有助于工程师在低压大电流与高压小电流等不同场景中合理选型、优化驱动电压并准确估算热损耗。文章从沟道电阻公式出发,深入剖析耐压与导通电阻的物理矛盾、温度系数的影响规律,并给出数据手册参数的正

weixin_29163857的博客 191

JPA的Repository详解

Spring Data JPA Spring Data是Spring提供的操作数据的框架,Spring Data JPA是Spring Data的一个模块,通过Spring data 基于jpa标准操作数据的模块。 Spring Data的核心能力,就是基于JPA操作数据,并且可以简化操作持久层的代码。 它使用一个叫作Repository的接口类为基础,它被定义为访问底层数据模型的超级接口。而对于...

三毛村滴雪鱼粉的博客 3万+

GraphSense介绍

GraphSense是一个跨账本加密货币分析平台 它的介绍在这里 代码也是开源的 graphsense-dashboard 用于交互式加密货币分析的Web仪表板。 可以看导进数据的情况 graphsense-transformation 基于spark/cassandra/java服务运行 GraphSense转换管道,用于将加密货币的区块/交易/标签等数据导入,可以看它指定的json格式: t...

幸福诗歌的博客 1081

05 Spring Data JPA基础查询方法

Spring Data JPA基础查询方法 Spring Data Common的Repository Repository位于Spring Data Common的org/springframework/data/repository中,它是Spring Data里做数据库操作的最底层的抽象接口、最顶层的父类。 Repository源码: package org.springframework...

仙贝儿 434

从UC3842的FB脚到COMP脚:一次讲透反激电源两种光耦反馈接法的选择与实战

本文深入探讨了UC3842 PWM控制器在反激式开关电源设计中的两种光耦反馈接法:FB脚与COMP脚方案。通过分析信号极性差异、稳定性特点及动态响应性能,提供场景化选型指南和可靠性设计要点,帮助工程师优化反馈环路设计,提升系统稳定性与效率。特别针对TL431和PC817等关键元件在温度漂移、老化衰减等实际问题给出解决方案。

weixin_28717683的博客 704

I2S时序及音频驱动

I2S、音频驱动

qq_41882586的博客 3946

java中repository_java中的 repository什么意思?

spring中的注解,@Repository用于标注数据访问组件,即组件。例:@Repositorypublic class VentorDaoImpl implements iVentorDao {}在一个稍大的项目中,如果组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找以及维护起来也不太方便。Spring2.5为我们引入了组件自动扫描机制,他在类路径下寻找标注了上述注解的类,...

weixin_34915171的博客 4241

GLMM(广义线性混合模型)原理以及分析步骤

广义线性混合模型(GLMM)是生态与进化研究中处理非正态数据的定制化工具,能同时分析固定效应和随机效应。它通过链接函数连接响应变量与预测因子,支持二项分布、泊松分布等非正态数据。研究流程包括:明确分析目标(固定效应影响与随机效应方差)、选择合适变量与分布、数据验证、参数估算(需根据模型复杂度选择PQL、拉普拉斯近似等方法)及模型优化(检验过离散与残差,通过信息准则或假设检验筛选最优模型)。GLMM能有效解决传统方法无法处理的"伪重复"和推广性问题,为复杂生物数据提供可靠分析框架。

wewil_lwin的博客 4962

java repository模式_MVC架构中的Repository模式 个人理解

个人理解:Repository是一个独立的层,介于领域层与数据映射层(数据访问层)之间。它的存在让领域层感觉不到数据访问层的存在,它提供一个类似集合的接口提供给领域层进行领域对象的访问。Repository是仓库管理员,领域层需要什么东西只需告诉仓库管理员,由仓库管理员把东西拿给它,并不需要知道东西实际放在哪。1. Repository模式是架构模式,在设计架构时,才有参考价值;2.Reposi...

weixin_39683858的博客 2222

openwrt编译及第一个安装包教程

Date: 2017.03.14 Made:SuperDeverloper Email: na1206@live.com Target: For mt7688 based board说明:本人在学习过程中走了不少弯路,希望本文档能为后来者提供便利。欢迎复制和使用本文档。本文档记录了搭建openwrt编译环境以及快速创建ipk包(openwrt上的安装程序)。本文档在实际应用中做过几次修改,以帮

SuperDevloper的博客 1万+

Oracle VM VirtualBox虚拟机网络配置与静态IP设置实战

本文详细讲解了Oracle VM VirtualBox虚拟机的网络配置,特别是如何设置静态IP以实现稳定访问。文章对比了NAT、桥接、仅主机等网络模式,并提供了从VirtualBox管理界面到Linux系统内部的完整配置步骤,帮助用户解决IP变动问题,构建可靠的本地开发测试环境。

weixin_28365523的博客 510

JpaRepository使用

Jpa查询 1. JpaRepository简单查询 基本查询也分为两种,一种是spring data默认已经实现,一种是根据查询的方法来自动解析成SQL。 预先生成方法 spring data jpa 默认预先生成了一些基本的CURD的方法,例如:增、删、改等等 继承JpaRepository public interface UserRepository extends JpaRepos...

人生最遗憾的莫过于:轻易地放弃了不该放弃的,固执地坚持了不该坚持的 5720

从源码编译CesiumForUnreal

从源码编译CesiumForUnreal插件

专注GIS开发 5643

Spring Data JPA实践与学习(二)

CrudRepository 接口 CrudRepository 为我们提供的方法有: count(): long 查询总数返回 long 类型; void delete(T entity) 根据 entity 进行删除; void deleteAll(Iterable<? extends T> entities) 批量删除; void deleteAll() 删除所有; void deleteById(ID id); 根据主键删除,查看源码会发现,其是先查询出来再进行删除; boolean

CodersCoder的博客 656

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JPA基础(二)Spring Data JPA

1、Spring Data JPA的概述 Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据库的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 Spring Data JPA 可以极大提高开发效率! Spring Data JPA 让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现,在实际的工作工程中,推荐使用Spring Data JPA + ORM(如:hibe

chinusyan的专栏 873

IEM模型,地表粗糙度模拟

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

Spring Data Jpa

首先需要定义特定于域类的存储库接口。接口必须扩展 Repository 并键入域类和ID类型。若要公开该域类型的CRUD方法,需要扩展 CrudRepository 而不是 Repository微调存储库定义通常情况下 接口扩展Repository,CrudRepository 或者PagingAndSortingRespository若不想扩展Spring Data接口,可以使用 @RepositoryDefinition,扩展CrudRepository公开了完整的方法来操作实体。

zeyunliu的博客 2545

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Spring Boot – CrudRepository 和 JpaRepository 的区别

Spring Boot建立在 Spring 之上,包含了 Spring 的所有特性。并且由于其快速的生产就绪环境使开发人员能够直接专注于逻辑而不是为配置和设置而苦苦挣扎,如今它正成为开发人员的最爱。Spring Boot 是一个基于微服务的框架,在其中制作可用于生产的应用程序只需要很少的时间。 CRUD 存储库 Spring Boot 中有一个名为 CrudRepository 的接口,其中包含用于 CRUD 操作的方法。它在存储库上提供通用的 Crud 操作。它在包org.springframewo.

allway2的博客 2718

SpringData的CrudRepository接口

 SpringData的所有接口 CrudRepository接口 ,其中提供了这些方法提供使用:需要注意的是在执行保存,删除,更新操作时需要将方法放到service中加上事务 CrudRepository 接口提供了最基本的对实体类的添删改查操作 T save(T entity);//保存单个实体 Iterable&lt;T&gt; save(Iterable&lt;? ext...

qq_36722039的博客 437

eclipse和idea代码通用吗_Python 工匠:写好面向对象代码的原则(中)

文章来源于piglei ,作者piglei在这篇文章中,我将继续介绍 SOLID 原则的第三位成员:L(里氏替换原则)。里氏替换原则与继承在开始前,我觉得有必要先提一下 继承(Inheritance)。因为和前面两条非常抽象的原则不同,“里氏替换原则”是一条非常具体的,和类继承有关的原则。在 OOP 世界里,继承算是一个非常特殊的存在,它有点像一把无坚不摧的双刃剑,强大且危险。合理使用继承,可以大...

weixin_39728544的博客 1259

Spring相关注解

注解

小小程序员的专栏 381

通过Reactive的方式访问RDBMS

Spring Data R2DBC 英文全部为Reactive Relational Database Connectivity 这个项目并不是一个完成的项目,目前处于孵化阶段。所以支持的数据库较少。 支持的数据库 Postgres(io.r2dbc:r2dbc-postgresql) H2(io.r2dbc:r2dbc-h2) Microsoft SQL Server(io.r2db...

weixin_43790623的博客 883

(WebFlux)003、多数据源R2dbc事务失效分析

在使用新东西的时候,还是要多实验,验证结果!遇到问题,不要慌,一步步来,就是干!如有问题,欢迎指正,交流。

编号94530 2502

Spring Data Repository 使用详解

Spring Data Repository 使用详解

深圳市多克创新科技有限公司 1943

02 | Spring Data Common 之 Repository 如何全面掌握?

本课时到这里就结束了,这一课时我讲解了 Repository 接口、CrudRepository 接口、PagingAndSortingRepository 接口、JpaRepository 接口的用法,通过源码我们知道了接口里面的方法有哪些、怎么实现的,也知道了 Spring 的动态代理机制是怎么运用到 UserRepository 接口的。

一叶知春秋 797

JPA CrudRepository方法详解

CrudRepository方法详解 通过类关系图可以看到CrudRepository提供了公共的通用的CRUD方法。 CrudRepository interface内容 @NoRepositoryBean public interface CrudRepository<T, ID> extends Repository<T, ID> { <S extends T> S save(S var1); <S extends T> Iterabl

hello world 3186

hibernate里批量删除

假设上一步结果是personList,然后传进去就可以了。调用这两个方法,就可以实现优雅的批量删除。可以用 hibernate自带的方法。1、先根据id集合查。

赵达宇的博客 609
上一篇: HashSet详解
下一篇: Dubbo消费端调用全过程实现分析-负载均衡与集群容错
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值