原文地址  https://blog.csdn.net/xuemengrui12/article/details/80525227?utm_source=blogxgwz0

https://www.imooc.com/article/16983

先看下两者的接口代码:
 
  1.  
    @NoRepositoryBean
  2.  
    public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
  3.  
    <S extends T> S save(S var1);
  4.  
    <S extends T> Iterable<S> save(Iterable<S> var1);
  5.  
    T findOne(ID var1);
  6.  
    boolean exists(ID var1);
  7.  
    Iterable<T> findAll();
  8.  
    Iterable<T> findAll(Iterable<ID> var1);
  9.  
    long count();
  10.  
    void delete(ID var1);
  11.  
    void delete(T var1);
  12.  
    void delete(Iterable<? extends T> var1);
  13.  
    void deleteAll();
  14.  
    }
 
  1.  
    @NoRepositoryBean
  2.  
    public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
  3.  
    List<T> findAll();
  4.  
    List<T> findAll(Sort var1);
  5.  
    List<T> findAll(Iterable<ID> var1);
  6.  
    <S extends T> List<S> save(Iterable<S> var1);
  7.  
    void flush();
  8.  
    <S extends T> S saveAndFlush(S var1);
  9.  
    void deleteInBatch(Iterable<T> var1);
  10.  
    void deleteAllInBatch();
  11.  
    T getOne(ID var1);
  12.  
    <S extends T> List<S> findAll(Example<S> var1);
  13.  
    <S extends T> List<S> findAll(Example<S> var1, Sort var2);
  14.  
    }
 

看一下他们的继承关系

注意下两者的save方法的不同,JpaRepository 中的save方法实现源码:
 
  1.  
    @Transactional
  2.  
    public <S extends T> List<S> save(Iterable<S> entities) {
  3.  
    List<S> result = new ArrayList<S>();
  4.  
    if (entities == null) {
  5.  
    return result;
  6.  
    }
  7.  
    for (S entity : entities) {
  8.  
    result.add(save(entity));
  9.  
    }
  10.  
    return result;
  11.  
    }
CrudRepository 中的save方法源代码
  1.  
    @Transactional
  2.  
    public <S extends T> S save(S entity) {
  3.  
    if (entityInformation.isNew(entity)) {
  4.  
    em.persist(entity);//是新的就插入
  5.  
    return entity;
  6.  
    } else {
  7.  
    return em.merge(entity); //不是新的merge
  8.  
    }
  9.  
    }
 
由源码可知CrudRepository 中的save方法是相当于merge+save ,它会先判断记录是否存在,如果存在则更新,不存在则插入记录。唉,还是需要多看源码啊

参考:

 
 

一、JpaRepository支持接口规范方法名查询。意思是如果在接口中定义的查询方法符合它的命名规则,就可以不用写实现。使用命名化参数,使用@Param即可,比如:
@Query(value="select o from UserModel o where o.name like %:nn") public List<UserModel> findByUuidOrAge(@Param("nn") String name);
二、spring data jpa 通过创建方法名来做查询,只能做简单的查询,那如果我们要做复杂一些的查询呢,多条件分页怎么办,这里,spring data jpa为我们提供了JpaSpecificationExecutor接口,只要简单实现toPredicate方法就可以实现复杂的查询。JpaSpecificationExecutor提供了以下接口

public interface JpaSpecificationExecutor<T> {

    T findOne(Specification<T> spec);

    List<T> findAll(Specification<T> spec);

    Page<T> findAll(Specification<T> spec, Pageable pageable);

    List<T> findAll(Specification<T> spec, Sort sort);

    long count(Specification<T> spec);
}
 

Spring Boot中CrudRepository与JpaRepository Dao中JpaRepository和JpaSpecificationExecutor查询的更多相关文章

  1. 记录Spring Boot大坑一个,在bean中如果有@Test单元测试,不会注入成功

    记录Spring Boot大坑一个,在bean中如果有@Test单元测试,不会注入成功 记录Spring Boot大坑一个,在bean中如果有@Test单元测试,不会注入成功 记录Spring Boo ...

  2. spring boot 配置访问其他模块包中的mapper和xml

    maven项目结构如下,这里只是简单测试demo,使用的springboot版本为2.1.3.RELEASE 1.comm模块主要是一些mybatis的mapper接口和对应的xml文件,以及数据库表 ...

  3. 将spring boot项目部署到tomcat容器中

    一. 我这里用的环境 tomcat: tomcat 8 jdk: jdk 7 spring boot 版本: 1.5 二. 将创建好的spring boot项目做如下修改 2.1. 修改打包形式 在p ...

  4. Spring Boot学习笔记:项目开发中规范总结

    Spring Boot在企业开发中使用的很广泛,不同的企业有不同的开发规范和标准.但是有些标准都是一致的. 项目包结构 以下是一个项目常见的包结构 以上是一个项目的基本目录结构,不同的项目结构会有差异 ...

  5. Spring Boot -- 启动流程分析之ApplicationContext 中

    上一节我们已经分析到AbsractApplicationContext类refresh方法中的postProcessBeanFactory方法,在分析registerBeanPostProcessor ...

  6. spring boot:redis+lua实现生产环境中可用的秒杀功能(spring boot 2.2.0)

    一,秒杀需要具备的功能: 秒杀通常是电商中用到的吸引流量的促销活动方式 搭建秒杀系统,需要具备以下几点: 1,限制每个用户购买的商品数量,(秒杀价格为吸引流量一般会订的很低,不能让一个用户全部抢购到手 ...

  7. Spring Boot入门一:在Eclipse中使用Spring boot

    1.安装插件 打开Eclipse-Help-Eclipse Marketplace-搜索spring tools,找到对应工具安装 下载完成后,重启eclipse,选择新建project-spring ...

  8. Spring Boot + JPA 多模块项目无法注入 JpaRepository 接口

    问题描述 Spring Boot + JPA 多模块项目,启动报异常: nested exception is org.springframework.beans.factory.NoSuchBean ...

  9. Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 预见未来最好的方式就是亲手创造未来 – <史蒂夫·乔布斯传> 』 运行环境: ...

随机推荐

  1. OCM_第十天课程:Section5—》数据仓库

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  2. tsconfig.json配置

    什么工具看什么官网-一般都会有说明的 https://www.tslang.cn/docs/handbook/tsconfig-json.html 概述 如果一个目录下存在一个tsconfig.jso ...

  3. 如何设置font-family

    第一部分: 根据font-family的原则,假如客户终端不认识前面的字体,就自动切换到第二种字体,第二种不认识就切换到第三种,以此类推.假如都不能识别就调用默认字体 根据font-family的字体 ...

  4. 搭建ssh框架项目(五)

    一.控制层优化 (1)创建BaseAction.java类 package com.cppdy.ssh.web.action; import javax.servlet.http.HttpServle ...

  5. wpf Assembly.LoadFile dll GetType 反射 抛异常 不具有由 URI 识别的资源。

    public static void LoadViewFromUri(this Window window, string baseUri) { try { var resourceLocater = ...

  6. HDU1711 Number Sequence(KMP模板题)

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. winform连接oracle时Oracle.DataAccess.dll版本问题 Silverlight

    1.通用TestOracle.zip部署到iis上,或直接运行程序测试当前全局程序集 protected void Button1_Click(object sender, EventArgs e) ...

  8. Web应用程序项目XXXX已配置为使用IIS。无法访问IIS 元数据库。您没有足够的特权访问计算机上的IIS

    错误图片:

  9. 微信支付支付宝支付生成二维码的方法(php生成二维码的三种方法)

    如果图简单,可以用在线生成 http://pan.baidu.com/share/qrcode?w=150&h=150&url=http://www.xinzhenkj.com 最简单 ...

  10. Timber(对Log类封装的一个工具)

    Timber(对Log类封装的一个工具) https://blog.csdn.net/hzl9966/article/details/51314137 https://www.jianshu.com/ ...