Spring Data JPA

Spring Data JPA

1. 什么是Spring Data?

Spring 的一个子项目。用于简化数据库访问,支持NoSQL关系数据库存储。其主要目标是使数据库的访问变得方便快捷。

1.1 Spring Data 项目所支持NoSQL存储:

      - - MongoDB(文档数据库)

      - - Neo4j (图形数据库)

      - - Redis(键/值存储)

      - - Hbase(列族数据库)

1.2 Spring Data 项目所支持的关系数据存储技术:

      - - JDBC

      - - JPA

2. 什么是Spring Data JPA ?

JPA Spring Data:  致力于减少数据访问层(DAO)的开发量。开发者唯一要做的,就只是声明持久层的接口,其他都交给Spring Data JPA 来帮你完成!

Spring Data JPA 是spring data 项目下的一个模块。 提供了一套基于JPA标准操作数据库的简化方案。底层默认的是依赖 Hibernate JPA来实现的。

2.1 Spring Data JPA的技术特点:

我们只需要定义接口并集成 Spring Data JPA中所提供的接口就可以了。不需要编写接口实现类。

2.2 Spring Data JPA接口继承结构

SpringDataJPA底层原理

使用JDK自带的动态代理机制:

接口:JpaRepository,JpaSpecificationExecutor

目标类:SimpleJpaRepository

代理类:usrsDao接口的实现类


2.2.1 Spring Data JPA接口概述

①、Repository :仅仅是一个标识,表名任何继承它的均为仓库接口类

②、CurdRepository : 继承Repository ,实现了一组CURD相关的方法

③、PagingAndSortingRepository :继承CurdRepository ,实现了一组分页排序相关的方法

④、JpaRepository : 继承PagingAndSortingRepository ,实现一组Jpa 规范相关的方法,。 其特点是可以帮助我们将其他接口的方法的返回值做适配处理。可以使得我们在开发时更方便的使用这些方法。

⑤、自定义 的 XXXRepository :需要继承JpaRepository  ,这样的XxxRepository 接口就具备了通用的数据访问控制层的能力。

⑥、JpaSpecificationExecutor :不属于Repository 体系,实现一组JpaCriteria 查询相关的方法,完成多条件查询,并且支持分页与排序


3.Spring整合Spring Data JPA

3.1 步骤:

3.1.1 创建项目

3.1.2 导入jar包

spring-ioc :

spring-aop:

spring-jdbc

spring-orm

spirng-test

apatch-logging

spring-data-jpa


log4j:

3.1.3 在类路径下创建applicationContext.xml

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

3.1.4 在类路径下创建jdbc.properties属性文件

3.1.5 创建实体类

3.1.6 继承Repository 接口实现简单的查询,更新

若我们定义的接口继承了Repository,则该接口会被IOC容器识别为一个Repository Bean 纳入到IOC容器中,进而可以在该接口中定义满足一定规范的方法

实际上,也可以通过@RepositoryDefinition(domainClass=Person.class,idClass=Integer.class)  注解来代替 extends Repository<Person, Integer>

Repository 接口是 Spring Data JPA中为我我们提供的所有接口中的顶层接口

Repository 提供了两种查询方式的支持

3.1.6.1基于方法名称命名规则查询

简单查询条件 :查询某一个实体类或是集合

在Repository  子接口中声明方法:

①、不是随便声明的,而需要符合一定的规范

②、查询方法以 find | read | get 开头

③、涉及条件查询时,条件的属性用条件关键字连接

④、要注意的是:条件属性以首字母大写

⑤、支持属性的级联查询。若当前类有符合条件的属性,则优先使用,而不使用级联属性。若需要使用级联属性,则属性之间使用_连接

spring data 支持的关键字

示例:

 接口

 测试

3.1.6.2  基于@Query 注解查询

基于@Query 注解查询有两种语句查询方式:

1)通过JPQL语句查询:他和 HQL 语法及其相似。

2)通过SQL语句查询

示例:

接口:


测试:

3.1.7 继承CrudRepository接口实现简单的CRUD

注意:CrudRepository中的更新方法与保存方法一致,此时需要给定主键(原理:先根据主键查询到对象,再根据给定的其他属性更新)

接口:


测试

3.1.8 继承PagingAndSortingRepository接口实现简单的分页和排序的处理

接口


测试:

3.1.9 继承JpaSpecificationExecutor接口实现复杂多条件的CRUD,并做分页和排序处理

接口:

是因为只有继承了repository接口spring-data-jpa才会创建接口的实现代理类。

测试:

3.1.10 用户自定义 Repository接口

3.1.10.1 创建自定义接口

3.1.10.2 创建自定义接口实现类

3.1.10.3 代理接口继承自定义接口

3.1.10.4 测试


3.1.11 关联映射操作

3.1.11.1 一对一的关联关系

需求:用户与角色的一对一的关联关系

用户:一方

角色:一方

3.1.11.1.1 创建接口:


3.1.11.1.2  创建关联的实体类:


用户类:

角色类:

3.1.11.1.3 测试


3.1.11.2  一对多的关联关系

需求:从角色到用户的一对多的关联关系

角色:一方

用户:多方

3.1.11.2 .1 修改实体类

用户类:

角色类:

注意:一对多,一方必须做懒加载处理,即在注解后加上:fetch = FetchType.EAGER

3.1.11.2 测试

3.1.11.3  多对多的关联关系

需求:一个角色可以拥有多个菜单,一个菜单可以分配多个角色。多对多的关联关系

角色:多方

菜单:多方

3.1.11.3.1 创建实体类

角色类:


菜单类:

3.1.11.3.2 测试

遇到的异常:

异常1:

failed to lazily initialize a collection of role 异常

原因:在实体类里,对应有一对多的外键关系,每一个一对多的关系查询的时候都涉及到一个懒加载,所以说,每一个OneToMany上都要添加fetch=FetchType.EAGER

解决方法:在注解manytomany后加fetch=FetchType.EAGER,如下图所示:


异常2:

Noproperty toPredicate found for type User!报错

解决:

       是因为dao层多写了Specification<Roles报错. 如下:

将Specification<Roles>改JpaSpecificationExcutor如下图:



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容