Spring Data JPA教程:简介

创建使用Java Persistence API的存储库是一个繁琐的过程,需要大量时间,并且需要大量样板代码。 通过执行以下步骤,我们可以消除一些样板代码:

  1. 创建一个抽象的基础存储库类,该类为实体提供CRUD操作。
  2. 创建扩展抽象基础存储库类的具体存储库类。

这种方法的问题在于,我们仍然必须编写用于创建数据库查询并调用它们的代码。 更糟的是,每次要创建新的数据库查询时,我们都必须这样做。 这是浪费时间

如果我告诉您我们可以创建JPA存储库而无需编写任何样板代码,您会怎么说?

很有可能您可能不相信我,但是Spring Data JPA可以帮助我们做到这一点。 Spring Data JPA项目的网站指出 :

实现应用程序的数据访问层已经很长一段时间了。 为了执行简单查询以及执行分页和审核,必须编写太多样板代码。 Spring Data JPA旨在通过将工作量减少到实际需要的数量来显着改善数据访问层的实现。 作为开发人员,您将编写包括自定义finder方法在内的存储库接口,Spring会自动提供实现

这篇博客文章介绍了Spring Data JPA。 我们将学习Spring Data JPA的真正含义,并快速浏览一下Spring Data存储库接口。

让我们开始吧。

什么是Spring Data JPA?

Spring Data JPA不是JPA提供程序 。 它是一个库/框架,在我们的JPA提供程序的顶部添加了额外的抽象层。 如果我们决定使用Spring Data JPA,则我们应用程序的存储库层包含以下三层:

  • Spring Data JPA通过扩展Sp​​ring Data存储库接口为创建JPA存储库提供支持。
  • Spring Data Commons提供了特定于数据存储的Spring Data项目共享的基础结构。
  • JPA Provider实现Java Persistence API。

下图说明了存储库层的结构:

springdatajpalayers

补充阅读:

  • Spring Data JPA与JPA:有什么区别?

乍一看,Spring Data JPA似乎使我们的应用程序变得更加复杂。 它的确在我们的存储库层中增加了一层,但是与此同时,它使我们无需编写任何样板代码。

听起来这是一个不错的权衡。 对?

Spring数据存储库简介

Spring Data JPA的功能在于由Spring Data Commons项目提供并由特定于数据存储的子项目扩展的存储库抽象。

我们可以使用Spring Data JPA而不用注意存储库抽象的实际实现,但是我们必须熟悉Spring Data存储库接口。 这些接口描述如下:

首先 ,Spring Data Commons项目提供以下接口:

  • Repository <T,ID扩展为Serializable>接口是一个标记接口,具有两个用途:
    1. 它捕获托管实体的类型和实体ID的类型。
    2. 它有助于Spring容器在类路径扫描期间发现“具体的”存储库接口。
  • CrudRepository <T,ID扩展为Serializable>接口为受管实体提供CRUD操作。
  • PagingAndSortingRepository <T,ID扩展为Serializable>接口声明用于对从数据库中检索到的实体进行排序和分页的方法。
  • QueryDslPredicateExecutor <T>接口不是“存储库接口”。 它声明使用QueryDsl 谓词对象从数据库检索实体的方法。

其次 ,Spring Data JPA项目提供以下接口:

  • JpaRepository <T,ID扩展为Serializable>接口是JPA特定的存储库接口,它将公共存储库接口声明的方法组合在单个接口后面。
  • JpaSpecificationExecutor <T>接口不是“存储库接口”。 它声明使用通过使用JPA标准API的Specification <T>对象从数据库检索实体的方法。

存储库层次结构如下所示:

springdataj存储库

很好,但是我们如何使用它们呢?

这是一个公平的问题。 本教程的下一部分将回答该问题,但实际上我们必须遵循以下步骤:

  1. 创建一个存储库接口,并扩展Spring Data提供的存储库接口之一。
  2. 将自定义查询方法添加到创建的存储库界面(如果需要的话)。
  3. 将存储库接口注入到另一个组件,并使用Spring自动提供的实现。

让我们继续并总结从这篇博客文章中学到的知识。

摘要

这篇博客文章教会了我们两件事:

  • Spring Data JPA不是JPA提供者。 它只是“隐藏”了其存储库抽象之后的Java Persistence API(和JPA提供程序)。
  • Spring Data提供了多个用于不同目的的存储库接口。

本教程的下一部分描述了如何获取所需的依赖关系。

如果您想了解更多有关Spring Data JPA的信息,请阅读我的Spring Data JPA教程 。

翻译自: https://www.javacodegeeks.com/2014/12/spring-data-jpa-tutorial-introduction.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入了解React组件重新渲染的条件和生命周期

React组件rerender的真正条件 当前组件的State中的属性改变时且当前组件的shouldcomponentupdate返回true&#xff0c;那么当前组件会rerender组件的props中的任一属性的值有变化(即使这个任一属性的值是对象&#xff0c;变化的仅仅是该对象中的某属性的值&#xff0c;此刻也算…

对怀孕的人有害的食物。。。朋友们记住咯!(欢迎转载)

有几个同事和朋友要生BB啦&#xff0c;好东东&#xff0c;转给你们提前学习一下~ 容易流产食物&#xff1a; 1、螃蟹&#xff1a;它味道鲜美&#xff0c;但其性寒凉&#xff0c;有活血祛瘀之功&#xff0c;故对孕妇不利&#xff0c;尤其是蟹爪&#xff0c;有明显的堕胎作用。 2…

Vss服务端用户存在,但客户端登陆不进去

打开客户端Vss提示“Cannot find SS.INI file for user userName”,这个错误是找不到用户userName的SS.INI文件。 解决办法 在服务器上找到Vss共享的文件夹&#xff0c;打开此文件夹下的users文件夹&#xff0c;然后找到userName文件夹打开后&#xff1a; 如果没有SS.INI文件&a…

Hystrix中的批量(折叠)请求

Hystrix具有折叠&#xff08;或批处理&#xff09;请求的高级功能。 如果两个或多个命令同时运行相似的请求&#xff0c;Hystrix可以将它们组合在一起&#xff0c;运行一个批处理请求&#xff0c;并将拆分结果分派回所有命令。 首先让我们看看Hystrix如何工作而不会崩溃。 假设…

C#繁简转换

//1.using System.Runtime.InteropServices; //2.import kernel32.dll [DllImport("kernel32.dll",EntryPoint "LCMapStringA")]    public static extern int LCMapString(int Locale,int dwMapFlags,byte[] lpSrcStr,int cchSrc,byte[] lpDestStr,…

css笔记 2

定义一个类选择器.center {text-align: center} h1 有 center 类。这意味将遵守 ".center" 选择器中的规则。<h1 class"center">This heading will be center-aligned</h1> 类名的第一个字符不能使用数字&#xff01; 派生选择器td.fancy {…

合并购物车

合并购物车逻辑分析 合并方向&#xff1a;cookie 购物车数据合并到 Redis 购物车数据中。合并数据&#xff1a;购物车商品数据和勾选状态。合并方案&#xff1a; Redis 数据库中的购物车数据保留。如果 cookie 中的购物车数据在 Redis 数据库中已存在 将 cookie 购物车数据覆盖…

Swing和JavaFX:使用JFXPanel

我很快将不得不在基于Swing的胖客户端中处理JavaFX –哦&#xff0c;对不起&#xff0c;我的意思是“多层富客户端”&#xff01; 因此&#xff0c;这使我来看看JFXPanel 。 JFXPanel是一个javax.swing.JComponent&#xff0c;用于将JavaFX内容嵌入到Swing-UI中。 JFXPanel的用…

关于nodejs中npm命令没有反应的解决方法

最近在学习angularJS&#xff0c;正在做一个单页面应用&#xff0c;在安装nodejs之后&#xff0c;发现命令行传了输入npm -v能输出结果外&#xff0c;其余npm的任何操作都没有反应&#xff0c;一开始我以为是下载的比较慢&#xff0c;等了半小时还是没动静&#xff0c;只有下标…

Red Hat Enterprise 5 server 上安装 memcached 的问题记录

国内私募机构九鼎控股打造APP&#xff0c;来就送 20元现金领取地址&#xff1a;http://jdb.jiudingcapital.com/phone.html内部邀请码&#xff1a;C8E245J &#xff08;不写邀请码&#xff0c;没有现金送&#xff09;国内私募机构九鼎控股打造&#xff0c;九鼎投资是在全国股份…

统计一个panel中lable的个数

int n panel.Controls.OfType<Label>().Count();转载于:https://www.cnblogs.com/linji/archive/2012/09/20/2694640.html

Java扩展机制可加载所有JAR

Java扩展机制在Java教程中被描述为“一种标准的&#xff0c;可伸缩的方式&#xff0c;以使自定义API可供Java平台上运行的所有应用程序使用。” 如了解扩展类加载中所述 &#xff0c;“扩展框架利用类加载委托机制”&#xff0c;其中扩展类在rt.jar &#xff08;和相关的JAR&am…

js中的 return false;

总的来说return false 的作用就是阻止事件的默认行为 1、 function check() { if(form.title.value"") { alert("请输入文章标题!"); return false; //注意不能写成 return(false); } if(form.content.value"") { alert("文章正文不能为空…

C++的文艺复兴: Why C++? 王者归来

因为又有人叫我去Quora的C2C站去回答问题了&#xff0c;这回是 关于 《2012 不宜进入的三个技术点ActionScript&#xff0c;Thread 和 C&#xff0c; C争议的争议最大。(要我说&#xff0c;.NET比C更需要慎重进入&#xff0c;呵)。我就在这里回复一下这个问题吧。 正好我前段时…

PAT_B_1012 数字分类 (有待改进)

题目描述&#xff1a; 给定一系列正整数&#xff0c;请按要求对数字进行分类&#xff0c;并输出以下 5 个数字&#xff1a; A​1​​ 能被 5 整除的数字中所有偶数的和&#xff1b; A​2​​ 将被 5 除后余 1 的数字按给出顺序进行交错求和&#xff0c;即计算 n​1​​ −n…

Drools和jBPM KIE A​​pps平台

随着Drools和jBPM&#xff08;KIE&#xff09;6系列出现了一个新的工作台&#xff0c;并有望最终实现用户的可扩展性。 我终于有了一些预告片&#xff0c;以显示此工作原理以及所存储的内容。 确保选择1080p并全屏显示&#xff0c;以达到最佳效果。 &#xff08;点击放大&…

js 严格模式

一、概述 除了正常运行模式&#xff0c;ECMAscript 5添加了第二种运行模式&#xff1a;"严格模式"&#xff08;strict mode&#xff09;。顾名思义&#xff0c;这种模式使得Javascript在更严格的条件下运行。 设立"严格模式"的目的&#xff0c;主要有以下…

软件工程之系统建模

1、系统工程&#xff1a; 软件工程由系统工程演变而来&#xff0c;要了解软件工程应先了解系统工程。系统工程一般通过自顶向下、自底向上的方法&#xff0c;用层次结构来来分析整个系统。在系统工程层次图中自顶向下依次是全局视图&#xff08;业务或产品域&#xff09;——领…

采访田飞师兄有感 ——by 李皈颖

来MSRA后一个月了&#xff0c;终于迎来了现代软件工程&#xff0c;开课第一天&#xff0c;殷老师&#xff08;也是我的“馒头”&#xff09;要求我们去采访一下前任师兄&#xff0c;了解一下他们的感受。我们组联合采访了陈凯师兄&#xff0c;但是因为我忘记了&#xff0c;所以…

不要在facelets中重复表情

您是否曾经在JSF中看到过像这样的重复EL表达式&#xff1f; <h:inputText value"#{oneBean.name}" rendered"#{anotherBean.showPerson}"/> <h:inputText value"#{oneBean.birthday}" rendered"#{anotherBean.showPerson}"/…