概述

  • SpringData,Spring 的一个子项目,用于简化数据库访问,支持 NoSQL关系数据库存储

  • SpringData 项目所支持 NoSQL 存储

    • MongDB(文档数据库)
    • Neo4j(图形数据库)
    • Redis(键/值存储)
    • Hbase(列族数据库)
  • SpringData 项目所支持的关系存储技术

    • JDBC
    • JPA(本次重点)

SpringData 整合 JPA 以及 HelloWorld

  • Maven 项目 jar 包导入

      <properties>
    <spring.verison>4.3.8.RELEASE</spring.verison>
    <hibernate.version>4.3.1.Final</hibernate.version>
    </properties>
    <dependencies>
    <dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-commons</artifactId>
    <version>1.6.2.RELEASE</version>
    </dependency> <dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>1.4.2.RELEASE</version>
    </dependency> <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.verison}</version>
    </dependency> <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>${spring.verison}</version>
    </dependency> <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.verison}</version>
    </dependency> <dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.10</version>
    </dependency> <dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5</version>
    </dependency> <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>${hibernate.version}</version>
    </dependency> <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>${hibernate.version}</version>
    </dependency> <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.21</version>
    </dependency>
    </dependencies>
  • 步骤

    • 配置 Spring 整合 JPA
    • 在 Spring 配置文件中配置 SpringData
    • 声明持久化层的接口,该接口继承 Repository
    • 在接口中声明需要的方法

配置 Spring 整合 JPA

  • 此步骤在我以前的博文(一篇 JPA 总结)末端可以找到,这里不再啰嗦。

在 Spring 配置文件中配置 SpringData

  • 即在 Spring 配置文件中配置 <jpa:repository />

  • 配置了 <jpa:repository /> 后,Spring 初始化容器时将会扫描 base-package 指定的包目录及其子目录,为继承 Repository 或其子接口的接口创建代理对象,并将代理对象注册为 Spring Bean,业务层便可以通过 Spring 自动封装的特性来直接使用该对象

  • 配置文件代码

      <!--base-package: 扫描 Repository Bean 所在的 package,DAO 层-->
    <jpa:repositories base-package="com.springdata.jpa.dao" entity-manager-factory-ref="entityManager"/>

声明持久化层的接口,继承 Repository 接口及其子接口

  • 我们在上一步中配置文件的 base-package 包下新建接口,继承 Repository 或其子接口

    • 在该步骤之前我们先需要编写实体,如我们声明的接口中 Person 类,其所需的配置和注解同时也可以参看以前的博文(一篇 JPA 总结)。

      • 所需实体类(Person & Address)的基本属性

在接口中声明需要的方法

  • 如上图,方法 getPersonByPersonName(String personName) 为根据 personName 属性 获取 Person 对象
  • 注意: 方法名必须保持一致!

测试

  • 至此我们对 SpringData 整合 JPA 环境以及准备代码工作完成,附上一张代码结构图,下面开始测试。

  • 在 maven 项目的 test 目录下新建测试类测试 getPersonByPersonName(String personName) 方法(自动生成的数据表中已加入数据,Person 表和 Address 表

      public class AllTest {
    
          private ApplicationContext context;
    private PersonRepository personRepository; {
    // 从对应的 spring 配置文件中,初始化 SpringIOC 容器
    context = new ClassPathXmlApplicationContext("spring-config.xml");
    // 由于 SpringData 的配置,继承 Repository 及其子接口的类将会被自动加载到 IOC 容器,便于获取
    personRepository = context.getBean(PersonRepository.class);
    }
    /**
    * 测试方法
    * */
    @Test
    public void testGetPerson() {
    // 使用从 Spring 的 IOC 容器获取的 personRepository 实例中调用测试方法
    Person person = personRepository.getPersonByPersonName("bgZyy");
    System.out.println(person);
    }
    }
  • 运行结果

Repository 接口

  • 其是一个空接口,即是一个标记接口,若我们定义的接口实现了 Repository 接口,则该接口就会被 IOC 容器识别为一个 Repository Bean,纳入到 IOC 容器中(Spring 帮我们实现该接口,进而被纳入 IOC 容器),进而可以在该接口中定义满足一定规范的方法
  • Repository Bean 也可以使用注解去代替实现接口

Repository 子接口

  • Repository: 仅仅是一个标识,表明任何继承它的均为仓库接口类
  • CrudRepository: 继承 Repository,实现了一组 CRUD 相关的方法
  • PagingAndSortingRepository: 继承 CrudRepository,实现了一组分页排序相关的方法
  • JpaRepository: 继承 PagingAndSortingRepository,实现一组 JPA 规范相关的方法
  • 自定义的 XxxxRepository 需要继承 JpaRepository,这样的 XxxxRepository 接口就具备了通用的数据访问控制层的能力。

JpaSpecificationExecutor: 不属于Repository体系,实现一组 JPA Criteria 查询相关的方法

SpringData 方法命名规范

查询操作

  • 查询方法以 find | read | get 开头

  • 涉及到查询条件时,用条件关键字连接(条件属性首字母需要大写

  • 遵循以上方法命名规则进一步理解 getPersonByPerosnName(String personName),以及如下两个方法

  • 对上图两方法进行测试

  • SpringData 所支持的关键字

级联属性的查询

  • SpringData 还支持级联属性的查询,如查询 Person 类中的 address 属性。若实体的属性拥有和级联属性同名的一个普通属性,那么默认情况下使用自身普通属性查询,若想使用级联属性查询,则需要使用下划线连接标记,如下:

查询方法解析流程

  • 创建如下的查询:getPersonByAddressCity();

    • 框架在解析该方法时,首先剔除 findBy,然后对剩下的先判断 userDepUuid (根据 POJO 规范,首字母变为小写)是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;
    • 从右往左截取第一个大写字母开头的字符串(此处为 City),然后检查剩下的字符串是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设 address 为查询实体的一个属性;
    • 接着处理剩下部分(City),先判断 address 所对应的类型是否有 city 属性,如果有,则表示该方法最终是根据 Address.city 的取值进行查询;否则继续按照步骤 2 的规则从右往左截取,最终如何进行查询。
    • 可能会存在一种特殊情况,即上述所说的级联属性的查询(在 IDEA 中编写 SpringData 方法有提示,不易出错)。

注解

使用上述 SpringData 方法规则进行查询简单,但是完成不了子查询等功能,此时便可以使用 @Query 注解

Query

  • 使用 @Query 注解实现子查询

  • 使用占位符为 @Query 注解传参

  • 使用命名参数为 @Query 注解传参

  • 使用本地 SQL 查询此时 Query 注解中需要标注 nativeQuery = true

  • 使用 @Query 注解进行模糊查询

@Modifying

  • 我们在 Spring 下配置了 service 包下的所有方法都会当做事务方法去处理,现在我们将进行更新操作,需要将其置一个事务方法,所以将接下来的测试方法放在 service 包下

  • 注意:默认情况下,SpringData 的每个方法上都有事务,但都是一个只读事务,他们不能完成修改操作

  • 结合 @Modlifying 注解和 @Query 注解以及事务实现更新操作

其他

我们所实现的接口不但可以去实现 Repository 接口,而且可以去实现其子接口完成更多或以更简单的方式完成功能。

  • 举例(查找某表所有的内容,使用 CURDRepository 可以快速实现)

    • 实现 CURDRepository 接口

    • 使用 findall() 方法
  • 实现翻页

    • 之前实现翻页我们需要对分页信息进行封装等各种准备工作,很麻烦!掌握了 SpringData + JPA 之后就可以快速实现翻页功能。
    • 方法测试展示(可以直接在测试类中去编写)
      • 首先需要实现 PageAndSoryRepository 接口

      • 翻页实现
      • 运行结果
  • 实现带查询条件的翻页

    • 实现 JPASpecificationPaging 接口
    • 具体实现如下面代码截图,与普通翻页类似
    • 运行结果(可以上面普通分页的 SQL 语句进行对比

掌握了 SpringData + JPA 在开发过程中可以显著的提高 Dao 层的开发效率,个人认为很值得学习!

哪位大神发现文中有什么不对的地方,还望指出,以及任何建议,我定会虚心接受,先谢!

一篇 SpringData+JPA 总结的更多相关文章

  1. 【串线篇】spring boot整合SpringData JPA

    一.SpringData简介 其中SpringData JPA底层基于hibernate 二.整合SpringData JPA JPA: Java Persistence API的简称,中文名Java ...

  2. Spring、SpringMVC、SpringData + JPA 整合详解

    原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7759874.html ------------------------------------ ...

  3. 【极简版】SpringBoot+SpringData JPA 管理系统

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 在上一篇中已经讲解了如何从零搭建一个SpringBo ...

  4. 带你搭一个SpringBoot+SpringData JPA的环境

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 不知道大家对SpringBoot和Spring Da ...

  5. SpringData JPA复合主键

    上一篇博客简单介绍了SpringData JPA实现简单的CRUD,分页与多条件的排序,那里的主键类型是Long,有时我们会遇到主键不是一个的,复合主键,经过调研如下.确定一个人,不能只根据他的姓名来 ...

  6. SpringBoot图文教程12—SpringData Jpa的基本使用

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...

  7. 我选择了MySQL和SpringData JPA

    我是3y,一年CRUD经验用十年的markdown程序员‍常年被誉为优质八股文选手 今天想跟大家聊聊数据库层面上的事,austin项目继续更新(注:今天聊的数据库都特指关系型数据库) 01.数据库选择 ...

  8. 6.4 SpringData JPA的使用

    引言:该文档是参考尚硅谷的关于springboot教学视屏后整理而来.当然后面还加入了一些自己从网上收集整理而来的案例! 一.SpringData JPA初步使用 1. springdata简介 2. ...

  9. 尚硅谷springboot学习34-整合SpringData JPA

    SpringData简介

随机推荐

  1. 第1章 HTTP协议基本介绍了解

    一.常见接口协议: HTTP     超文本传输协议 HTTPS   安全超文本传输协议 FTP       文件传输协议 TCP       网络控制协议 IP          互联网协议 UDP ...

  2. Linux中安装硬盘后对硬盘的分区以及挂载

    我将使用VM来进行模拟 先使用df看下我的电脑硬盘信息: df -h 可以看到只有一个sda1分区装载/boot,还有一个扩展分区 查看dev下的硬盘: 只有一个硬盘(两个分区) 注意: 如果你是ID ...

  3. 分布式:Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)

    互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...

  4. Process 0:0:0 (0x1ffc) Worker 0x00000001E580A1A0 appears to be non-yielding on Scheduler 3. Thread creation time: 13153975602106.

    现场报错如下: Process 0:0:0 (0x1ffc) Worker 0x00000001E580A1A0 appears to be non-yielding on Scheduler 3. ...

  5. HTTP与TCP的区别和联系

    工作原理(转载): https://www.cnblogs.com/zimohul/p/6506406.html 相信不少初学手机联网开发的朋友都想知道Http与Socket连接究竟有什么区别,希望通 ...

  6. WIndows 使用VS编译 Lua5

    从Lua5.1开始官方给出的文件只有源代码和makefile文件了,官网给出的bulid方式也是在linux平台,如果只是想找个库使用下可以到这里来下载:http://joedf.ahkscript. ...

  7. syslog的坑

    先看看代码: g_log, err := syslog.NewLogger(syslog.LOG_INFO, ) 再看看syslog的源码: // NewLogger creates a log.Lo ...

  8. 《生命》第二集:Reptiles and Amphibians (爬行和两栖动物)

    第二集也是一个个动物的片段,不过集中在爬行和两栖类动物上. 印度尼西亚的瀑布蟾蜍进化出神器强有力的脚,能够抓牢很多物体,是逃生的手段,同一环境下,卵石蟾蜍,能够缩紧全身肌肉,眼山坡下滑,是另一种逃生是 ...

  9. Jenkins+Ansible+Gitlab自动化部署三剑客-gitlab本地搭建

    实际操作 准备linux初始环境 关闭防火墙 systemctl stop firewalld 开机自己关闭 systemctl disable firewalld 设置安全配置 为关闭 vim /e ...

  10. SQL UPDATE 语句

    Update 语句 Update 语句用于修改表中的数据. 语法: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 Person: LastName FirstName ...