SpringDataJpa

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

1 SpringDataJpa认识

1.1 SpringDataJpa结构

Spring Data JPA的七个Repository接口:

Repository(org.springframework.data.repository.Repository)
CrudRepository(org.springframework.data.repository.CrudRepository)
PagingAndSortingRepository(org.springframework.data.repository.PagingAndSortingRepository)
JpaRepository (org.springframework.data.jpa.repository.JpaRepository)
QueryByExampleExecutor(org.springframework.data.repository.query.QueryByExampleExecutor)
JpaSpecificationExecutor (org.springframework.data.jpa.repository.JpaSpecificationExecutor)
QueryDslPredicateExecutor (org.springframework.data.querydsl.QueryDslPredicateExecutor)

两大Repository实现类:

SimpleJpaRepository(org.springframework.data.jpa.repository.support.SimpleJpaRepository)
QueryDslJpaRepository(org.springframework.data.jpa.repository.support.QueryDslJpaRepository)

结构图:
在这里插入图片描述说明:

  1. 几个查询、及批量保存方法,和 CrudRepository 接口相比,返回的是 List,使用起来更方便。
  2. 增加了 InBatch 删除, 实际执行时,后台生成一条sql语句,效率更高些。相比较而言,CrudRepository 接口的删除方法,都是一条一条删除的,即便是 deleteAll 也是一条一条删除的。
  3. 增加了 getOne() 方法,切记,该方法返回的是对象引用,当查询的对象不存在时,它的值不是Null

2 SpringDataJpa用法

2.1 普通CRUD

//查询所有
@Test
public void testFindAll()throws Exception{
    List<Employee> list = employeeRepository.findAll();
    for (Employee employee : list) {
        System.out.println(employee);
    }
}

//批量查询
@Test
public void testFindAll1()throws Exception{
    List lists = Arrays.asList(1L,2L,3L);
    List<Employee> list = employeeRepository.findAll(lists);
    for (Employee employee : list) {
        System.out.println(employee);
    }
}

//查询一条数据
@Test
public void testFindOne()throws Exception{
    Employee one = employeeRepository.findOne(1L);
    System.out.println(one);
}

//保存
@Test
public void testSave()throws Exception{
    Employee employee = new Employee();
    employee.setUsername("皮皮虾");
    employee.setPassword("123");
    employee.setEmail("123@qq.com");
    employee.setAge(18);
    employeeRepository.save(employee);
}
//修改
@Test
public void testUpdate()throws Exception{
    Employee employee = new Employee();
    employee.setId(274L);
    employee.setUsername("皮皮怪");
    employee.setPassword("123");
    employee.setEmail("123@qq.com");
    employee.setAge(18);
    employeeRepository.save(employee);
}

//删除
@Test
public void testDel()throws Exception{
    employeeRepository.delete(274L);
}

//批量删除
@Test
public void testDel1()throws Exception{
    List lists = Arrays.asList(272L,273L);
    List all = employeeRepository.findAll(lists);
    employeeRepository.deleteInBatch(all);
}

//总条数
@Test
public void testCount()throws Exception{
    System.out.println(employeeRepository.count());
}

2.2 排序和分页

//进行分页功能
@Test
public void testPage() {
    //1.需要先创建一个page对象(注意:页数是从0开始计算【0就是第1页】)
    Pageable pageable = new PageRequest(0, 10);
    //2.进行查询
    Page<Employee> page = employeeRepository.findAll(pageable);
    System.out.println(page.getTotalElements()); //总条数
    System.out.println(page.getTotalPages()); //总页数
    System.out.println(page.getContent()); //当前页数据
    System.out.println(page.getNumber()); //第几页
    System.out.println(page.getNumberOfElements()); //当前页有多少个数据
    System.out.println(page.getSize()); //每页条数
}

//进行排序功能
@Test
public void testSort() {
    //排序 :第一个参数是排序的规则(DESC/ASC)  后面参数是排序的字符
    Sort sort = new Sort(Sort.Direction.DESC,"username");
    List<Employee> emps = employeeRepository.findAll(sort);
    for (Employee emp : emps) {
        System.out.println(emp);
    }
}

//分页与排序的集成
@Test
public void testPageAndSort() {
    //排序 :第一个参数是排序的规则(DESC/ASC)  后面参数是排序的字符
    Sort sort = new Sort(Sort.Direction.DESC,"username");
    Pageable pageable = new PageRequest(0, 10,sort);
    //2.进行查询
    Page<Employee> page = employeeRepository.findAll(pageable);
    for (Employee employee : page) {
        System.out.println(employee);
    }
}

2.3 根据条件进行查询

//通过员工名称来查询员工
List<Employee> findEmployeeByUsername(String username);

List<Employee> findEmployeeByUsernameLike(String username);

2.4 @Query注解查询

//查询数据--query注解查询
@Query("select o from Employee o where o.username like ?1")
List<Employee> findEmployee(String username);
//根据顺序查询
@Query("select o from Employee o where  o.username like ?1 and o.email like ?2")
List<Employee> query02(String username,String email);
根据参数名称
@Query("select o from cn.itsource.pss.domain.Employee o where  o.username like :username and o.email like :email")
List<Employee> query03(@Param("username") String username,@Param("email")  String email);

 //对原生sql语句
@Query(value="select count(*) from employee ",nativeQuery=true)
Long query04();

2.5 JPA规则(动态sql)的查询

步骤:

  1. 继承该JpaSpecificationExecutor 接口
  2. 测试
2.5.1 原生写法
@Test
public void testSpec()throws Exception{
    List<Employee> list = employeeRepository1.findAll(new Specification<Employee>() {
        @Override
        public Predicate toPredicate(Root<Employee> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
            Path path = root.get("username");
            Predicate predicate = cb.like(path, "%1%");
            return predicate;
        }
    });
    for (Employee employee : list) {
        System.out.println(employee);
    }
}
@Test
public void testSpec1()throws Exception{

    List<Employee> list = employeeRepository1.findAll(new Specification<Employee>() {
        @Override
        public Predicate toPredicate(Root<Employee> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
            Path path1 = root.get("username");
            Path path2 = root.get("age");
            Predicate predicate1 = cb.like(path1, "%1%");
            Predicate predicate2 = cb.gt(path2, 25);
            CriteriaQuery<?> where = cq.where(predicate1, predicate2);
            return where.getRestriction();
        }
    });
    for (Employee employee : list) {
        System.out.println(employee);
    }
}

//条件+分页排序
@Test
public void testSpec2()throws Exception{
    Sort sort = new Sort(Sort.Direction.DESC, "age");
    Pageable pageable = new PageRequest(0, 5,sort);
    Specification<Employee> specification = new Specification<Employee>() {
        @Override
        public Predicate toPredicate(Root<Employee> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
            Path path1 = root.get("username");
            Predicate predicate1 = cb.like(path1, "%1%");
            return predicate1;
        }
    };
    Page<Employee> page = employeeRepository1.findAll(specification, pageable);
    for (Employee employee : page) {
        System.out.println(employee);
    }
}
2.5.2 springdatajpa的查询sql的插件
  1. 引入第三方jar包
  2. 继承 JpaSpecificationExecutor 接口
Specification<Employee> specification = Specifications.<Employee>and()
         .eq(StringUtils.isNotBlank(employee.getUsername()),"username", employee.getUsername())
         .gt(employee.getAge() !=null, "age", employee.getAge())
         .build();

2.6 BaseQuery和EmployeeQuery这些抽取

BaseQuery类

/**
 * BaseQuery:公共查询对象   完成分页查询
 */
public abstract class BaseQuery {
    //当前页
    private Integer currentPage = 1;
    //每页条数
    private  Integer pageSize = 10;
    //排序字段
    private String orderByName;
    //排序类型
    private String orderByType = "DESC";

    public Integer getJpaPage(){
        return currentPage -1;
    }

    //排序
    public Sort createSort() {
        Sort sort = null;
        if (getOrderByName() != null) {
            String orderByName = getOrderByName();
            Sort.Direction direction = null;
            if (getOrderByType().equals("DESC")) {
                direction = Sort.Direction.DESC;
            } else {
                direction = Sort.Direction.ASC;
            }
            sort = new Sort(direction, orderByName);
        }
        return sort;
    }

    //分页
    public abstract Specification createSpecification();
}

EmployeeQuery类

/**
 * 单独查询对象
 */
public class EmployeeQuery extends BaseQuery{
    //自身条件
    private String username;
    private String email;
    private Integer age;

    //抽取查询
    @Override
    public Specification createSpecification() {
        Specification<Employee> specification = Specifications.<Employee>and()
                .like(StringUtils.isNotBlank(username), "username","%"+username+"%")
                .gt(Objects.nonNull(age), "age", age)
                .build();
        return specification;
    }
}

实现方法

@Test
public void testSpec1()throws Exception{
    EmployeeQuery employeeQuery = new EmployeeQuery();
    employeeQuery.setUsername("1");
    employeeQuery.setAge(18);

    employeeQuery.setOrderByName("age");
    employeeQuery.setOrderByType("ASC");

    Specification specification = employeeQuery.createSpecification();
    Sort sort = employeeQuery.createSort();

    //分页
    Pageable pageable = new PageRequest(employeeQuery.getJpaPage(), employeeQuery.getPageSize(),sort);
    Page<Employee> page = employeeRepository1.findAll(specification, pageable);
    for (Employee employee : page) {
        System.out.println(employee);
    }
}
多租户Saas架构设计分析(基础篇) 本篇先给大家介绍一下相关的概念和常见问题。 实践篇链接:https://blog.csdn.net/haponchang/article/details/104246317 SaaS简介 SaaS是Software-as-a-Service(软件即服务)的简称,“软件即服务”?是不是有点拗口?其实你就理解成为“按需租用别人提供的软件服务”就可以了,它是一种软件交付模式。... 阅读详情

相关推荐

Linux内存压力测试工具【memtester】详且精

对Linux下的压力测试工具memtester有一个比较人性化的概述,以及避坑心得。

weixin_44118923的博客 1万+

spring data jpa入门教程

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

qq_24095055的博客 1119

拆开一个烧坏的IGBT模块,手把手教你识别过压、过流、过温的“案发现场”

本文详细解析了IGBT模块失效分析的实战技巧,通过观察铝层熔化纹路、焊锡溢出形态等物理痕迹,手把手教你识别过压、过流、过温的典型失效模式。文章提供了从基础工具包到现场快速诊断的完整流程,帮助工程师精准定位IGBT模块失效的根本原因。

weixin_30655569的博客 423

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

【计算机图形学】Pov-Ray画的垃圾小车

效果: 代码: #include "colors.inc" #include "metals.inc" #include "glass.inc" //相机 //这个位置车子刚好落在草地上了 camera { location direction z*1.5 right x*image_width/image_height look_at

lishichengyan的博客 1749

基于Xilinx的I2S Receiver IP核和I2S Transmitter IP核音频验证

基于Xilinx的I2S Receiver IP核和I2S Transmitter IP核音频验证 文章目录前言一、工程构架二、Xilinx IP的配置1.I2S Transmitter IP配置:2.I2S Receiver IP配置:3.WM8960的配置:总结 前言 本实验基于Xilinx ZU4EV平台,也适用于ZYNQ平台。音频验证完成,记录调过程。 ①Xilinx 音频IP只支持主模式,左对齐或右对齐方式,16bit或24bit字长。 ②WM8960器件作为从模式;24bit字长;数据传输格

weixin_45637597的博客 6812

Spring Data JPA 的JpaRepository

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

weixin_46038239的博客 1171

SAP(ERP)工艺路线(Routing)业务视角解析

工艺路线(Routing)也是PP模块,即生产制造模块中最重要核心主数据之一,也是ERP(SAP)顾问,必需从业务与系统深入掌握的重要主数据,它也是整个生产计划与生产流程的重要基础。因为执行步骤只是操作层面的认知,业务顾问需要从业务本质上去理解它,要真正从业务视角理解工艺路线的业务价值,而不仅仅是操作层面的认知。因此将工艺路线理解为“有以上业务本质的理解,然后进到SAP系统中,就容易理解工艺路线(Routing)的每一组成部分结构与功能了,本质就是理解制造企业如何将设计意图转化为物理现实的编码规则。

m0_45197968的博客 1498

spring整合dataJPA

表:sqlt_user;

CUITAO2305532402的博客 600

13-单片机模块化程序: 单片机AT指令配置模块程序模板(非阻塞版)

资料源码:https://gitee.com/yang456/OpenProgrammingModuleForMCU.git 点击加入群聊【单片机,物联网,上位机】: 说明1:知识从未如此性感。 烂程序员关心的是代码,好程序员关心的是数据结构和它们之间的关系! 说明2:学的是思想,而非程序!此代码思路适用于所有的单片机。 说明3:学会以后,下面的代码可能会跟你一辈子! 说明4:这一系列文章是为大幅度裁剪本人博客文章!使博客文章更有条理。便于推其它教程! 拷贝这两个文件到自己的工程 ..

杨奉武的博客 1280

Autosar代码包初识 2 - 如何编译Vector包内Demo工程

Vetcor autosar代码包Demo工程编译,GreenHills,RH850,Autosar,Davinci COnfigurator

weixin_42412049的博客 5184

SpringDataJPA(一)SpringDataJPA的简单使用

源码 GitHub: https://github.com/291685399/springboot-learning/tree/master/springboot-springdatajpa01 SpringDataJPA是什么? SpringDataJPA是Spring提供的持久层的解决方案,Spring Data JPA旨在通过减少实际需要的工作量来显着改善数据访问层的实现 SpringDa...

断橋殘雪的博客 3638

行业变革下的功能安全落地痛点3:高阶智驾安全责任转移 —— 从 “人为中心” 到 “机器主责” 的产业阵痛

文章围绕高阶智驾(L3 级)落地挑战,探讨安全责任从 “人控” 向 “机控” 转移的本质、技术短板导致的责任模糊、全球法规实践及技术 - 法规 - 保险的破局路径。

my9111526 126

SpringDataJPA

spirng data jpa是spring提供的一套简化JPA开发的框架,按照约定好的规则进行【方法命名】去写dao层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。同时提供了很多除了CRUD之外的功能,如分页、排序、复杂查询等等。

编程就像打游戏,编出一个项目就打过了一个BOSS 1325

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

lwip-2.0.3

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

springDataJpa初识总结

JPA基础知识 传统jdbc存在的问题? 操作繁琐 解决方案: 封装工具类 占位符赋值麻烦 解决方案: *思路: 我么能不能通过面向对象的方法进行封装呢?达到封装好之后sava(Object obj) 的方法 *思路延伸: 我们能不能自动拼接sql呢?只要完成自动拼接,我们就实现了上面的想法 *通过分析:我们发现,只要能 建立实体类之间的对应关系 简历实体类属性和表字段之间的关系 这样我们...

qq_39876666的博客 7044

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

SpringDataJPA(6)SpringDataJPA概述与使用SpringDataJPA进行CRUD操作

1. SpringDataJPA概述 1.1 概述 官网:链接 SpringDataJPA是一种访问数据库层的一种技术手段,操作起来非常简单 特性: 对spring和JPA进行统一的整合,可以很方便的操作数据库 Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架 可使开发者用极简的代码即可实现对数据库的访问和操作。 它提供了包括增删改查等在内的常用功能,且易于扩展!使用 Spring Data JPA 可以极大提高开发效率!

учёба 617

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

SpringDataJpa使用详解

概述 这里就不引用冠冕堂皇的介绍了。用我概括的话说。他就是一个类似hibernate,mybatis数据访问层的框架。官网有详细的介绍, 戳这里 Jpa是什么?他是一套规范,类似restful风格一样,都是一套规范。使用Jpa必须按照它的规范来操作数据访问。 SpringDataJpa==Jpa规范+Hibernate底层 为什么要用jpa 笔者其实很喜欢用mybatis写sql...

安迪爸爸 6741

JPA+SpringDataJPA

JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合ORM技术SpringDataJPA是对JPA的一个高级封装,提供了相关API更加方便的操作数据库hibernate、toplink等持久层框架遵守jpa规范,jpa默认使用hibnernate作为ormSpringDataJpa是再jpa的规范下提供了Repository层的实现。

优快云博客技术,java高级工程师,业务层架构师,高级管理认证,毕业设计可以联系我 947

SpringDataJPA(二)SpringDataJPA自定义关键字查询

源码 GitHub: https://github.com/291685399/springboot-learning/tree/master/springboot-springdatajpa02 什么是自定义关键字查询 SpringDataJPA支持自定义关键字查询,在方法中含有关键字,SpringDataJPA会为你自动生成SQL SpringDataJPA提供的关键字 关键字 方法名...

断橋殘雪的博客 4164

SpringDataJpa整理

首先什么是JPA? JPA是一种ORM框架的规范 什么是SpringDataJpa? 其是Spring封装了JPA的规范,提供了在Repository层(接口层)的实现 Hibernate与SpringDataJpa的关系? Hibernate是SpringDataJpa的服务提供者,最终SpringDataJpa调用服务提供者完成对数据库持久化的操作,服务提供者可以替换成其他 废话不多说,开始基...

csdn_lxfy的博客 534

Springdatajpa

springdatajpa的增删改查 (1)定义一个接口,继承 JpaRepository (2)配置applicationComtext.xml <!-- springdatajpa配置 引入事务和实体管理工厂--> <jpa:repositories base-package="cn.itsource.aisell.repository" ...

y1770464784的博客 623

整合SpringDataJpa

SpringBoot是为了简化Spring应用的创建、运行、调试、部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个 WEB 工程 上一篇介绍了Spring JdbcTemplate的使用,对比原始的JDBC而言,它更加的简洁。但随着表的增加,重复的CRUD工作让我们苦不堪言,这时候...

weixin_30616969的博客 131

SpringDataJpa扩展

一.SpringDataJpa扩展 对SpringDataJpa的原来功能进行了相应的增加(代码是拷备) 1.BaseRepository 接口 @NoRepositoryBean:让SpringdataJpa不要自动为它生成子类 @NoRepositoryBean public interface BaseRepository<T, ID extends Serializable&...

蔡茂的博客 1179
上一篇: java入门面试题
下一篇: Shrio_Shrio集成Spring&Authentication身份认证&Authorizing授权
虞铭轩、
博客等级 码龄7年 3粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值