`
a137268431
  • 浏览: 157812 次
文章分类
社区版块
存档分类
最新评论

一步步学习 Spring Data 系列之JPA(二)

 
阅读更多
上一篇文章对Spring Data JPA更深()一步剖析。

上一篇只是简单的介绍了Spring Data JPA的简单使用,而往往在项目中这一点功能并不能满足我们的需求。这是当然的,在业务中查询是一件非常头疼的事,毕竟不可能只是对一张表的查询是吧? 其实在业务中往往会涉及到多张表的查询,以及查询时需要的各种条件。当然这不用担心,毕竟这是对JPA的支持,而我们在用JPA原生态API的时候往往可能会把一些个方法写得很凌乱,没得一个具体的规范来写自己的方法在后期维护上肯定会很困难。当然你自己也可以封装一些方法来使用,而当我们使用到Spring Data JPA时,它已经帮助我们完成了这个方法的规范了。

来一起看一下复杂查询时它为我们提供的接口。

JpaSpecificationExecutor.class
Java代码收藏代码
  1. publicinterfaceJpaSpecificationExecutor<T>{
  2. TfindOne(Specification<T>spec);
  3. List<T>findAll(Specification<T>spec);
  4. Page<T>findAll(Specification<T>spec,Pageablepageable);
  5. List<T>findAll(Specification<T>spec,Sortsort);
  6. longcount(Specification<T>spec);
  7. }


在这个接口里面出现次数最多的类就是Specification.class,而这个类主要也就是围绕Specification来打造的,Specification.class是Spring Data JPA提供的一个查询规范,而你只需围绕这个规范来设置你的查询条件便可,我们来看一下Specification.class这个接口中有些什么东西。

Specification.class
Java代码收藏代码
  1. publicinterfaceSpecification<T>{
  2. PredicatetoPredicate(Root<T>root,CriteriaQuery<?>query,CriteriaBuildercb);
  3. }

只有一个方法toPredicate,而其中的参数大家并不陌生,都是JPA规范中的,ROOT查询中的条件表达式、CriteriaQuery条件查询设计器、CriteriaBuilder条件查询构造器,而我们在使用复杂对象查询时,实现该方法用JPA去构造对象查询便可。

下面来看一个小例子:
Java代码收藏代码
  1. @Repository("userDao")
  2. publicinterfaceIUserDaoextendsJpaSpecificationExecutor<User>{

仍然只是一个空接口,这次继承的是JpaSpecificationExecutor了。
再写一测试用例:查询用户表中name包含Sam的记录,并分页按照birth排倒序
Java代码收藏代码
  1. publicclassUserDaoTest{
  2. privatestaticApplicationContextcontext=newClassPathXmlApplicationContext("applicationContext.xml");
  3. privatestaticIUserDaouserDao=(IUserDao)context.getBean("userDao");
  4. publicvoidfindBySpecAndPaginate(){
  5. Page<User>page=userDao.findAll(newSpecification<User>(){
  6. @Override
  7. publicPredicatetoPredicate(Root<User>root,CriteriaQuery<?>query,CriteriaBuildercb){
  8. root=query.from(User.class);
  9. Path<String>nameExp=root.get("name");
  10. returncb.like(nameExp,"%Sam%");
  11. }
  12. },newPageRequest(1,5,newSort(Direction.DESC,newString[]{"birth"})));
  13. StringBuilderstout=newStringBuilder("以下是姓名包含Sam人员信息:").append("\n");
  14. stout.append("|序号|username|password|name|sex|birth|").append("\n");
  15. intsortIndex=1;
  16. for(Useru:page.getContent()){
  17. stout.append("|").append(sortIndex);
  18. stout.append("|").append(u.getUsername());
  19. stout.append("|").append(u.getPassword());
  20. stout.append("|").append(u.getName());
  21. stout.append("|").append(u.getSex());
  22. stout.append("|").append(u.getBirth());
  23. stout.append("|\n");
  24. sortIndex++;
  25. }
  26. System.err.println(stout);
  27. }
  28. publicstaticvoidmain(String[]args){
  29. UserDaoTesttest=newUserDaoTest();
  30. test.findBySpecAndPaginate();
  31. }
  32. }


当然,这只是一个测试,很简单的一个条件查询方法。你也可以设计复杂的查询来得到自己所需的结果,我这只是写一个很简单的方法来带大家入门。

写了两篇文章了,还没有讲Spring Data JPA为什么只需定义接口就可以使用,其实这也不难发现,查看源码,可以找到针对JpaRepository和JpaSpecificationExecutor有一个实现类,SimpleJpaRepository.class,这个类实现了刚才所提的两个接口。而Spring在给我们注入实现类的时候,就正是这个SimpleJpaRepository.class,具体的实现方式我就不在这意义赘述了,大家如果有兴趣可以去查看它的源码,和传统的JPA实现是一样的。



通过这篇文章我们学习到了,当要使用复杂的条件查询时,我们可以选择使用此接口来完善我们的需求,这篇文章就讲到这里,在下一篇文章中我主要是讲Spring Data JPA为我们提供的注解查询。
分享到:
评论

相关推荐

    一步步深入理解Spring内部原理-带源码

    10. **Spring Data**:Spring Data是一个项目集合,旨在简化数据访问层的开发,支持多种数据库,如JPA、MongoDB等。它提供了统一的API,使得数据操作更加便捷。 通过学习以上知识点,并结合实际项目,你可以逐步...

    spring揭秘 完整带标签

    《Spring揭秘》这本书将通过实例和详细的解释,引导读者一步步掌握这些核心概念和技术,无论你是初学者还是经验丰富的开发者,都能从中受益匪浅。通过阅读本书,你可以深入理解Spring框架的工作原理,并能熟练地将其...

    spring-boot-tutorial:Spring Boot教程带您一步步学习Spring Boot,其中包含大量示例。SpringBoot教程是一本关于Spring Boot学习的开源书。用大量实例带你一步一步走进Spring Boot的世界

    每个章节都可能涵盖了一个或多个具体的功能点,比如如何创建第一个 Spring Boot 应用,如何配置数据库,如何使用 Spring Data JPA 进行数据操作,以及如何实现 RESTful API 等。通过这个教程,你可以逐步深入理解 ...

    spring快速入门教程

    本教程将带你一步步了解Spring的核心概念,包括IoC(控制反转)、AOP(面向切面编程)以及Spring Boot的快速启动特性。 一、Spring核心:依赖注入(DI/IoC) 依赖注入是Spring框架的核心机制,它允许对象之间的...

    JAVA学习之一步步搭建spring框架

    【标题】:深入理解Spring框架搭建过程 【摘要】:本文详细阐述了如何逐步搭建Java中的Spring框架,从...随着对Spring的理解不断深入,你还可以探索Spring Boot、Spring Data JPA等更高级的特性,进一步提升开发效率。

    spring源码从入门到放弃

    《Spring源码从入门到...从基础概念到高级用法,再到内部实现机制,一步步深入Spring的世界,虽然可能会遇到挑战,但收获的将是深度理解和实战技能的提升。对于想要提升自身技术水平的开发者来说,这是一条必经之路。

    Spring中文版基础教程,从0开始教你Spring

    本教程将带你一步步地探索Spring的世界。 1. **Spring框架概述** - Spring的核心理念是依赖注入(Dependency Injection,DI),它通过控制反转(Inversion of Control,IoC)来管理对象的生命周期和相互依赖关系。...

    基于时下最新 Java 技术栈 Spring Boot 3 + Vue 3 开发的前后端分离学习型.zip

    在当前的IT行业中,前后端分离的开发模式已经成为主流,特别是在Web应用开发...这个学习型项目将引导你通过实际操作,一步步掌握这些技术和最佳实践。通过实践,你将能够独立地开发出高效、易于维护的前后端分离应用。

    spring mvc step by step,例子

    这篇博文通过一步步的教程,将引导我们深入了解如何使用Spring MVC构建一个简单的Web应用。 首先,我们需要了解Spring MVC的基本组件和它们的作用: 1. **DispatcherServlet**:这是Spring MVC的前端控制器,负责...

    build-spring-framework

    《构建Spring框架:深入理解与实践》 Spring框架作为Java企业级应用开发的基石,以其模块化、松...动手实践是巩固理论知识的最佳途径,因此,强烈建议你按照教程一步步操作,亲自构建Spring,以加深理解和应用能力。

    Idea Spring boot 入门dome

    本教程将带你一步步走进Spring Boot的世界。 ### 1. 创建Spring Boot项目 在IntelliJ IDEA(Idea)中创建Spring Boot项目,首先选择"New Project",然后在项目模板中找到"Spring Initializr"。这里你可以选择所需...

    spring 小记

    这篇小记将深入探讨Spring的主要组件和关键特性,带你一步步走进Spring的世界。 首先,我们要理解Spring的核心——依赖注入。在传统的Java程序中,对象之间的依赖关系通常是硬编码的,这使得代码难以测试和维护。...

    Spring-boot 入门案例

    本案例将带你一步步走进 Spring Boot 的世界,体验其强大的功能和简洁的开发方式。 ### 1. Spring Boot基础知识 Spring Boot 基于 Spring Framework,但并非其一部分。它提供了快速构建、配置和部署应用程序的能力...

    SpringBoot入门级Demo带静态后台模版

    这个入门级Demo将带你一步步了解SpringBoot的项目结构、配置、数据访问以及前端展示,是学习SpringBoot和相关技术的良好起点。在实践中,你可以根据需求扩展功能,如添加更多控制器、完善用户认证等,逐步提升对...

    Spring首选资料(从入门到深入)

    通过这份"Spring首选资料(从入门到深入)",你将一步步了解Spring的各个方面,从基本概念到高级特性,从简单的配置到复杂的架构设计,逐步成长为Spring框架的专家。无论是初学者还是经验丰富的开发者,都能从中受益...

    springboot(一)-(三)的代码资源

    总的来说,这个压缩包资源是一个学习Spring Boot基础和实践操作的好材料,通过一步步的实践,读者可以掌握Spring Boot的核心概念,理解自动配置的工作原理,熟悉开发流程,并且能够运用到实际的企业级项目开发中。

    Java Spring 框架搭建步骤

    本指南将详细介绍如何一步步搭建一个基于Spring的项目环境。 1. **安装Java开发工具(JDK)** - 首先,确保你的计算机上已经安装了JDK,并且版本至少为1.8,因为Spring框架支持这个版本及以上。 - 下载并安装JDK,...

    spring-boot-example_springbootexample_springboot_DEMO_

    Spring Boot 是一个由 Pivotal 团队开发的框架,旨在简化 Spring 应用程序的初始搭建以及开发过程。它的核心特性是可以内嵌...记得跟着文档一步步操作,理解每个部分的功能,将有助于深入掌握Spring Boot的精髓。

    Spring基础教程

    总的来说,Spring基础教程将带你了解如何配置和使用Spring框架,从Bean的声明和装配,到AOP和数据访问,再到Web应用的开发,一步步建立起对Spring全面的理解。通过学习,你将能够利用Spring的强大功能,提升开发效率...

    springboot简易教程.zip

    SpringData JPA提供了对多种数据库的抽象,简化了数据库操作。通过Repository接口,开发者可以快速实现CRUD操作,同时支持复杂查询。 5. **Thymeleaf模板引擎** Thymeleaf是一种流行的HTML模板引擎,可以与...

Global site tag (gtag.js) - Google Analytics