`
- 浏览:
157812 次
-
一步步学习 Spring Data 系列之JPA(二)
继上一篇文章对Spring
Data JPA更深()一步剖析。上一篇只是简单的介绍了Spring Data JPA的简单使用,而往往在项目中这一点功能并不能满足我们的需求。这是当然的,在业务中查询是一件非常头疼的事,毕竟不可能只是对一张表的查询是吧? 其实在业务中往往会涉及到多张表的查询,以及查询时需要的各种条件。当然这不用担心,毕竟这是对JPA的支持,而我们在用JPA原生态API的时候往往可能会把一些个方法写得很凌乱,没得一个具体的规范来写自己的方法在后期维护上肯定会很困难。当然你自己也可以封装一些方法来使用,而当我们使用到Spring
Data JPA时,它已经帮助我们完成了这个方法的规范了。来一起看一下复杂查询时它为我们提供的接口。JpaSpecificationExecutor.class
-
publicinterfaceJpaSpecificationExecutor<T>{
-
-
TfindOne(Specification<T>spec);
-
-
List<T>findAll(Specification<T>spec);
-
-
Page<T>findAll(Specification<T>spec,Pageablepageable);
-
-
List<T>findAll(Specification<T>spec,Sortsort);
-
-
longcount(Specification<T>spec);
-
}
在这个接口里面出现次数最多的类就是Specification.class,而这个类主要也就是围绕Specification来打造的,Specification.class是Spring Data JPA提供的一个查询规范,而你只需围绕这个规范来设置你的查询条件便可,我们来看一下Specification.class这个接口中有些什么东西。Specification.class
-
publicinterfaceSpecification<T>{
-
-
PredicatetoPredicate(Root<T>root,CriteriaQuery<?>query,CriteriaBuildercb);
-
}
只有一个方法toPredicate,而其中的参数大家并不陌生,都是JPA规范中的,ROOT查询中的条件表达式、CriteriaQuery条件查询设计器、CriteriaBuilder条件查询构造器,而我们在使用复杂对象查询时,实现该方法用JPA去构造对象查询便可。下面来看一个小例子:
-
@Repository("userDao")
-
publicinterfaceIUserDaoextendsJpaSpecificationExecutor<User>{
-
}
仍然只是一个空接口,这次继承的是JpaSpecificationExecutor了。再写一测试用例:查询用户表中name包含Sam的记录,并分页按照birth排倒序
-
publicclassUserDaoTest{
-
-
privatestaticApplicationContextcontext=newClassPathXmlApplicationContext("applicationContext.xml");
-
-
privatestaticIUserDaouserDao=(IUserDao)context.getBean("userDao");
-
-
publicvoidfindBySpecAndPaginate(){
-
Page<User>page=userDao.findAll(newSpecification<User>(){
-
@Override
-
publicPredicatetoPredicate(Root<User>root,CriteriaQuery<?>query,CriteriaBuildercb){
-
root=query.from(User.class);
-
Path<String>nameExp=root.get("name");
-
returncb.like(nameExp,"%Sam%");
-
}
-
-
},newPageRequest(1,5,newSort(Direction.DESC,newString[]{"birth"})));
-
-
StringBuilderstout=newStringBuilder("以下是姓名包含Sam人员信息:").append("\n");
-
stout.append("|序号|username|password|name|sex|birth|").append("\n");
-
intsortIndex=1;
-
for(Useru:page.getContent()){
-
stout.append("|").append(sortIndex);
-
stout.append("|").append(u.getUsername());
-
stout.append("|").append(u.getPassword());
-
stout.append("|").append(u.getName());
-
stout.append("|").append(u.getSex());
-
stout.append("|").append(u.getBirth());
-
stout.append("|\n");
-
sortIndex++;
-
}
-
System.err.println(stout);
-
}
-
-
publicstaticvoidmain(String[]args){
-
UserDaoTesttest=newUserDaoTest();
-
test.findBySpecAndPaginate();
-
}
-
}
当然,这只是一个测试,很简单的一个条件查询方法。你也可以设计复杂的查询来得到自己所需的结果,我这只是写一个很简单的方法来带大家入门。写了两篇文章了,还没有讲Spring Data JPA为什么只需定义接口就可以使用,其实这也不难发现,查看源码,可以找到针对JpaRepository和JpaSpecificationExecutor有一个实现类,SimpleJpaRepository.class,这个类实现了刚才所提的两个接口。而Spring在给我们注入实现类的时候,就正是这个SimpleJpaRepository.class,具体的实现方式我就不在这意义赘述了,大家如果有兴趣可以去查看它的源码,和传统的JPA实现是一样的。
通过这篇文章我们学习到了,当要使用复杂的条件查询时,我们可以选择使用此接口来完善我们的需求,这篇文章就讲到这里,在下一篇文章中我主要是讲Spring Data JPA为我们提供的注解查询。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
10. **Spring Data**:Spring Data是一个项目集合,旨在简化数据访问层的开发,支持多种数据库,如JPA、MongoDB等。它提供了统一的API,使得数据操作更加便捷。 通过学习以上知识点,并结合实际项目,你可以逐步...
《Spring揭秘》这本书将通过实例和详细的解释,引导读者一步步掌握这些核心概念和技术,无论你是初学者还是经验丰富的开发者,都能从中受益匪浅。通过阅读本书,你可以深入理解Spring框架的工作原理,并能熟练地将其...
每个章节都可能涵盖了一个或多个具体的功能点,比如如何创建第一个 Spring Boot 应用,如何配置数据库,如何使用 Spring Data JPA 进行数据操作,以及如何实现 RESTful API 等。通过这个教程,你可以逐步深入理解 ...
本教程将带你一步步了解Spring的核心概念,包括IoC(控制反转)、AOP(面向切面编程)以及Spring Boot的快速启动特性。 一、Spring核心:依赖注入(DI/IoC) 依赖注入是Spring框架的核心机制,它允许对象之间的...
【标题】:深入理解Spring框架搭建过程 【摘要】:本文详细阐述了如何逐步搭建Java中的Spring框架,从...随着对Spring的理解不断深入,你还可以探索Spring Boot、Spring Data JPA等更高级的特性,进一步提升开发效率。
《Spring源码从入门到...从基础概念到高级用法,再到内部实现机制,一步步深入Spring的世界,虽然可能会遇到挑战,但收获的将是深度理解和实战技能的提升。对于想要提升自身技术水平的开发者来说,这是一条必经之路。
本教程将带你一步步地探索Spring的世界。 1. **Spring框架概述** - Spring的核心理念是依赖注入(Dependency Injection,DI),它通过控制反转(Inversion of Control,IoC)来管理对象的生命周期和相互依赖关系。...
在当前的IT行业中,前后端分离的开发模式已经成为主流,特别是在Web应用开发...这个学习型项目将引导你通过实际操作,一步步掌握这些技术和最佳实践。通过实践,你将能够独立地开发出高效、易于维护的前后端分离应用。
这篇博文通过一步步的教程,将引导我们深入了解如何使用Spring MVC构建一个简单的Web应用。 首先,我们需要了解Spring MVC的基本组件和它们的作用: 1. **DispatcherServlet**:这是Spring MVC的前端控制器,负责...
《构建Spring框架:深入理解与实践》 Spring框架作为Java企业级应用开发的基石,以其模块化、松...动手实践是巩固理论知识的最佳途径,因此,强烈建议你按照教程一步步操作,亲自构建Spring,以加深理解和应用能力。
本教程将带你一步步走进Spring Boot的世界。 ### 1. 创建Spring Boot项目 在IntelliJ IDEA(Idea)中创建Spring Boot项目,首先选择"New Project",然后在项目模板中找到"Spring Initializr"。这里你可以选择所需...
这篇小记将深入探讨Spring的主要组件和关键特性,带你一步步走进Spring的世界。 首先,我们要理解Spring的核心——依赖注入。在传统的Java程序中,对象之间的依赖关系通常是硬编码的,这使得代码难以测试和维护。...
本案例将带你一步步走进 Spring Boot 的世界,体验其强大的功能和简洁的开发方式。 ### 1. Spring Boot基础知识 Spring Boot 基于 Spring Framework,但并非其一部分。它提供了快速构建、配置和部署应用程序的能力...
这个入门级Demo将带你一步步了解SpringBoot的项目结构、配置、数据访问以及前端展示,是学习SpringBoot和相关技术的良好起点。在实践中,你可以根据需求扩展功能,如添加更多控制器、完善用户认证等,逐步提升对...
通过这份"Spring首选资料(从入门到深入)",你将一步步了解Spring的各个方面,从基本概念到高级特性,从简单的配置到复杂的架构设计,逐步成长为Spring框架的专家。无论是初学者还是经验丰富的开发者,都能从中受益...
总的来说,这个压缩包资源是一个学习Spring Boot基础和实践操作的好材料,通过一步步的实践,读者可以掌握Spring Boot的核心概念,理解自动配置的工作原理,熟悉开发流程,并且能够运用到实际的企业级项目开发中。
本指南将详细介绍如何一步步搭建一个基于Spring的项目环境。 1. **安装Java开发工具(JDK)** - 首先,确保你的计算机上已经安装了JDK,并且版本至少为1.8,因为Spring框架支持这个版本及以上。 - 下载并安装JDK,...
Spring Boot 是一个由 Pivotal 团队开发的框架,旨在简化 Spring 应用程序的初始搭建以及开发过程。它的核心特性是可以内嵌...记得跟着文档一步步操作,理解每个部分的功能,将有助于深入掌握Spring Boot的精髓。
总的来说,Spring基础教程将带你了解如何配置和使用Spring框架,从Bean的声明和装配,到AOP和数据访问,再到Web应用的开发,一步步建立起对Spring全面的理解。通过学习,你将能够利用Spring的强大功能,提升开发效率...
SpringData JPA提供了对多种数据库的抽象,简化了数据库操作。通过Repository接口,开发者可以快速实现CRUD操作,同时支持复杂查询。 5. **Thymeleaf模板引擎** Thymeleaf是一种流行的HTML模板引擎,可以与...