JPA+SpringData 操作数据库-使用正宗JPA语法操作数据库

快关注公众号持续追新吧...

往期回顾...

原文地址:http://www.cnblogs.com/crawl/p/7735616.html

前言:之前为大家详细介绍了 JPA 的知识,之前提到 JPA 和 SpringData 结合才能发挥出无比巨大的威力。那么,今天楼主开始介绍 SpringData,写此篇的目的主要是为了复习,如果能帮助到有需要的朋友,那再好不过了。

一、SpringData 概述

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

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

二、Spring Data JPA 的 Helloworld

1.环境搭建:

1)新建 Java Project:springdata

2)当前工程下新建 lib 目录

3)加入Spring 的 jar 包:spring-framework-4.0.0.RELEASE\required 目录下所有

4)加入Hibernate 和 JPA 的 jar 包:hibernate-release-4.2.4.Final\lib\required 和 hibernate-release-4.2.4.Final\lib\jpa 目录下的所有

5)加入 c3p0 和 MqSQL 的驱动

6)手动进行 Build Path

2.新建Spring 的配置文件 applicationContext.xml,并进行数据源的配置

1)db.properties文件

2)applicationContext.xml文件中:

3)注意:希望大家能够养成良好的单元测试的习惯,以便及时发现问题,及时解决:测试数据源是否获取成功,新建一个 SpringDataTest 单元测试类

只要输出数据库连接的信息,那就证明我们数据源的的配置没有问题了。

3.配置 JPA 的 EntityManagerFactory

测试 JPA 是否配置成功:

新建一个实体类 Person,添加必要的 JPA 注解,创建一个空的 JPA 的测试方法,执行此方法,查看是否生成数据表

4.配置 JPA 的事务管理器和支持注解的事务

5.配置 SpringData

1)加入 SpringData 的 jar 包:spring-data-jpa\required 目录下所有(自创建的目录),手动 Build Path

还要加入 SpringData 依赖的日志包 slf4j

2)加入 jpa 的命名空间,左下角 Namespaces 中添加

配置 SpringData 扫描的包和 EntityManagerFactory

6.编写 SpringData 的代码,测试 HelloWorld

1)创建一个 PersonRepsotory 接口继承 Repository 接口,声明一个方法

2)编写测试方法:需要在测试类中引入 PersonRepository 的实例,通过 ctx.getBean(PersonRepository.class); 获取,以后不再赘述。

这样便会获取 LastName 为 AA 的数据库中的那条记录。

三、Repository 接口

1.Repository是一个空接口,即是一个标记接口。源码

2.若我们定义的接口实现了 Repository,则该接口会被 IOC 容器识别为一个 Repository Bean,纳入到 IOC 容器中,进而可以在该接口中定义一些符合规范的方法

3.还可以通过@RepositoryDefinition注解来替代继承 Repository 接口

4.Repository接口的实现类

1)CrudRepository: 继承 Repository,实现了一组 CRUD 相关的方法

2)PagingAndSortingRepository: 继承 CrudRepository,实现了一组分页排序相关的方法

3)JpaRepository: 继承 PagingAndSortingRepository,实现一组 JPA 规范相关的方法

4)自定义的 XxxxRepository 需要继承 JpaRepository,这样的 XxxxRepository 接口就具备了通用的数据访问控制层的能力。

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

四、SpringData 的方法定义规范SpringData 的方法定义规范

1.不能随便声明,需要符合一定的规范

2.查询的方法以 find、read、get 开头

3.涉及条件查询时条件的属性要以关键字连接,条件属性首字母大写

1)SpringData 支持的关键字

2)举例:

测试:

4.支持级联查询,若当前类有符合条件的查询,则优先使用,而不使用级联查询,若需要使用级联查询,则属性之间需要使用 _ (下划线)来连接

1)创建 Address 类,添加对应的 JPA 注解,在 Person 类中添加 Address 类的引用,使用 @ManyToOne 映射,生成对应的数据表

2)创建测试方法:此时为级联查询

3)为 Person 类添加 addressId 属性后,若再进行相同的测试,则不是级联查询了,而查询条件为 Person 类中的 addressId 属性。若要再进行级联查询,需要在属性之间需要使用 _ (下划线)来连接

五、@Query 注解

1.使用@Query注解可以自定义 JPQL 语句实现更加灵活的查询

定义方法:

测试方法:

2.为 @Query 注解传递参数的两种方式

1)使用占位符:

测试:

2)使用命名参数:

3.带有LIKE 关键字的 @Query 注解

1)需要在测试方法中手动加上 %,不推荐

2)SpringData允许在占位符上添加 %

3)SpringData允许在命名参数上添加 %

4.使用 @Query 执行本地 SQL 查询,在 @Query 注解中添加参数nativeQuery=true

六、@Modifying 注解

1.使用@Modifying 配合 @Query 可以完成 UPDATE 和 DELETE 操作

2.可以通过自定义 JPQL 完成 UPDATE 和 DELETE 操作,注:JPQL 不支持使用 INSERT

3.在 @Query 中编写 JPQL 语句,但必须使用@Modifying注解修饰,以通知 SpringData 此操作是一个 UPDATE 或 DELETE 操作

4.UPDATE或 DELETE 操作需要使用事务,所以需要定义 service 层,在 service 层方法上添加事务操作

5.示例:

七、Repository 接口的子接口

1、CrudRepository 接口;测试此接口的save(Iterable entities) 方法进行批量保存

1)使自定义的接口继承 CrudRepository 接口

2)Service 层:需要事务

3)测试:

2.PagingAndSortingRepository接口

1)实现分页操作(带排序):(只读事务,不需要再 service 层中编写

3.JpaRepository接口:测试此接口的saveAndFlush() 方法,此方法相当于 JPA 中的 merge() 方法,详见 JPA 笔记

补:JpaSpecificationExecutor接口,不属于Repository体系,实现一组 JPA Criteria 查询相关的方法 ,即带条件的分页查询

1)自定义的接口必须实现 Repository 或 Repository 的子接口 还有 JpaSpecificationExecutor 接口

八、自定义 Repository 方法:为某一个 Repository 上添加自定义方法

1.步骤:

1)定义一个接口: 声明要添加的, 并自实现的方法

2)提供该接口的实现类:类名需在要声明的 Repository(以 PersonRepository 为例) 后添加 Impl, 并实现方法

3)声明 Repository 接口(即 PersonRepository 接口), 并继承 1) 声明的接口

4)测试使用:

本篇完。

持续更新完善中......欢迎关注转发,共同学习

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181104G0V9YY00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券