Spring Data 概述

  Spring Data

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

  SpringData 项目所支持 NoSQL 存储:

  MongoDB (文档数据库)

  Neo4j(图形数据库)

  Redis(键/值存储)

  Hbase(列族数据库)

  SpringData 项目所支持的关系数据存储技术:

  JDBC

  JPA

  Spring Data JPA

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

  开发步骤

  配置 Spring 整合 JPA

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

  声明持久层的接口,该接口继承 Repository,Repository 是一个标记型接口,它不包含任何方法,如必要,Spring Data 可实现 Repository 其他子接口,其中定义了一些常用的增删改查,以及分页相关的方法。

  在接口中声明需要的方法,Spring Data 将根据给定的策略来为其生成实现代码。

  搭建环境

  导包:郑州 不  孕 不 育  医院:http://wapyyk.39.net/zz3/zonghe/1d427.html/

  antlr-2.7.7.jar

  c3p0-0.9.2.1.jar

  com.springsource.net.sf.cglib-2.2.0.jar

  com.springsource.org.aopalliance-1.0.0.jar

  com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

  commons-logging-1.1.3.jar

  dom4j-1.6.1.jar

  hamcrest-core-1.3.jar

  hibernate-c3p0-4.2.4.Final.jar

  hibernate-commons-annotations-4.0.2.Final.jar

  hibernate-core-4.2.4.Final.jar

  hibernate-entitymanager-4.2.4.Final.jar

  hibernate-jpa-2.0-api-1.0.1.Final.jar

  javassist-3.15.0-GA.jar

  jboss-logging-3.1.0.GA.jar

  jboss-transaction-api_1.1_spec-1.0.1.Final.jar

  junit-4.12.jar

  mchange-commons-java-0.2.3.4.jar

  mysql-connector-java-5.1.7-bin.jar

  slf4j-api-1.6.1.jar

  spring-aop-4.0.0.RELEASE.jar

  spring-aspects-4.0.0.RELEASE.jar

  spring-beans-4.0.0.RELEASE.jar

  spring-context-4.0.0.RELEASE.jar

  spring-core-4.0.0.RELEASE.jar

  spring-data-commons-1.6.2.RELEASE.jar

  spring-data-jpa-1.4.2.RELEASE.jar

  spring-expression-4.0.0.RELEASE.jar

  spring-jdbc-4.0.0.RELEASE.jar

  spring-orm-4.0.0.RELEASE.jar

  spring-tx-4.0.0.RELEASE.jar

  spring-web-4.0.0.RELEASE.jar

  spring-webmvc-4.0.0.RELEASE.jar

  applicationContext.xml

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xmlns:context="http://www.springframework.org/schema/context"

  xmlns:tx="http://www.springframework.org/schema/tx"

  xmlns:jpa="http://www.springframework.org/schema/data/jpa"

  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

  http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd

  http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd

  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

  org.hibernate.cfg.ImprovedNamingStrategy

  org.hibernate.dialect.MySQL5InnoDBDialect

  true

  true

  update

  Repository 接口

  Repository 接口是 Spring Data 的一个核心接口,不提供任何方法,只要遵循接口方法定义规范,就无需写实现类,与继承 Repository 接口等价的一种方式,就是在持久层接口上使用 @RepositoryDefinition 注解,并为其指定domainClass 和 idClass 属性。

  Repository 的子接口

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

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

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

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

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

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

  Spring Data 方法定义规范

  简单条件查询,查询某一个实体或者集合,查询方法以 get、find、read 开头,涉及条件查询时,条件的属性用关键字连接,条件属性以首字母大写。

  例如

  public interface PersonRepository extends Repository {

  Person getByLastName(String lastName);

  List getByLastNameStartingWithAndIdLessThan(String lastName, Integer id);

  List getByLastNameEndingWithAndIdLessThan(String lastName, Integer id);

  List getByEmailInAndAgeLessThan(List list, Integer id);

  List getByAddress_IdGreaterThan(Integer id);

  }

  Spring Data 支持的关键字

  KeywordSampleJPQL snippet

  AndfindByLastnameAndFirstname… where x.lastname = ?1 and x.firstname = ?2

  OrfindByLastnameOrFirstname… where x.lastname = ?1 or x.firstname = ?2

  Is,EqualsfindByFirstname,findByFirstnameIs,findByFirstnameEquals… where x.firstname = 1?

  BetweefindByStartDateBetween… where x.startDate between 1? and ?2

  LessThanfindByAgeLessThan… where x.age < ?1

  LessThanEqualfindByAgeLessThanEqual… where x.age <= ?1

  GreaterThanfindByAgeGreaterThan… where x.age > ?1

  GreaterThanEqualfindByAgeGreaterThanEqual… where x.age >= ?1

  AfterfindByStartDateAfter… where x.startDate > ?1

  BeforefindByStartDateBefore… where x.startDate < ?1

  IsNullfindByAgeIsNull… where x.age is null

  IsNotNull,NotNullfindByAge(Is)NotNull… where x.age not null

  LikefindByFirstnameLike… where x.firstname like ?1

  NotLikefindByFirstnameNotLike… where x.firstname not like ?1

  StartingWithfindByFirstnameStartingWith… where x.firstname like ?1(parameter bound with appended %)

  EndingWithfindByFirstnameEndingWith… where x.firstname like ?1 (parameter bound with prepended %)

  ContainingfindByFirstnameContaining… where x.firstname like ?1(parameter bound wrapped in %)

  OrderByfindByAgeOrderByLastnameDesc… where x.age = ?1 order by x.lastname desc

  NotfindByLastnameNot… where x.lastname <> ?1

  InfindByAgeIn(Collection ages)… where x.age in ?1

  NotInfindByAgeNotIn(Collection age)… where x.age not in ?1

  TruefindByActiveTrue()… where x.active = true

  FalsefindByActiveFalse()… where x.active = false

  IgnoreCasefindByFirstnameIgnoreCase… where UPPER(x.firstame) = UPPER(?1)

  @Query 注解

  这种查询可以声明在 Repository 方法中,摆脱像命名查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是 Spring Data 的特有实现。

  索引参数:

  索引值从1开始,查询中 ?x 的个数需要与方法形参个数相等,并且顺序也要一致。

  @Query("SELECT p FROM Person p WHERE p.lastName = ?1 and p.age = ?2")

  Person getByLastNameAndAge(String lastName, int age);

  命名参数:

  可以定义好参数名,赋值值采用 @Param(参数名),而不用管顺序。

  @Query("SELECT p FROM Person p WHERE p.lastName = :lastName and p.id = :id")

  Person getByLastNameAndId(@Param("id")int id, @Param("lastName")String lastName);

  本地查询:

  可以使用 @Query 执行本地查询,只要设置 nativeQuery 为 true。

  @Query(value = "SELECT COUNT (id) FROM jpa_persons", nativeQuery = true)

  long getTotalCount();

  @Modifying 注解和事务

  @Query 与 @Modifying 这两个注解一起使用,可以执行 UPDATE、DELETE 操作。

  注意,UPDATE、DELETE 需要使用事务,因此需要定义在 Service 层。

  事务:

  Spring Data 提供了默认的事务处理方式,即所有的查询均为只读事务。

  对于自定义的方法,如需改变 Spring Data 提供的事务方式,可以在方法上添加 @Transactional 注解。

  进行多个 Repository 操作时,也应该使它们在同一个事务中处理,按照分层架构的思想,这部分属于业务逻辑层,因此,需要在 Service 层实现对多个 Repository 的调用,并在相应的方法上声明事务。

  CrudRepository 接口

  CrudRepository 接口提供了最基本的对实体类的添删改查操作

  T save(T entity) 保存单个实体

  Iterable save(Iterable entities) 保存集合

  T findOne(ID id) 根据id查找实体

  boolean exists(ID id) 根据id判断实体是否存在

  Iterable findAll() 查询所有实体,不用或慎用

  long count() 查询实体数量

  void delete(ID id) 根据Id删除实体

  void delete(T entity) 删除一个实体

  void delete(Iterable entities) 删除一个实体的集合

  void deleteAll() 删除所有实体,不用或慎用

  PagingAndSortingRepository 接口

  该接口提供了分页与排序功能

  Iterable findAll(Sort sort) 排序

  Page findAll(Pageable pageable) 分页查询(含排序功能)

  @Test

  public void testPagingAndSortingRespository(){

  int pageNo = 3;

  int pageSize = 5;

  Sort.Order order = new Sort.Order(Sort.Direction.DESC, "id");

  Sort.Order order1 = new Sort.Order(Sort.Direction.ASC, "email");

  Sort sort = new Sort(order,order1);

  PageRequest pageable = new PageRequest(pageNo, pageSize, sort);

  Page page = personRepository.findAll(pageable);

  System.out.println(page.getNumberOfElements());

  System.out.println(page.getContent());

  }

  JpaRepository 接口

  该接口提供了JPA的相关功能

  List findAll() 查找所有实体

  List findAll(Sort sort) 排序、查找所有实体

  List save(Iterable entities) 保存集合

  void flush() 执行缓存与数据库同步

  T saveAndFlush(T entity) 强制执行持久化

  void deleteInBatch(Iterable entities) 删除一个实体集合

  JpaSpecificationExecutor 接口

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

  Specification:封装 JPA Criteria 查询条件。通常使用匿名内部类的方式来创建该接口的对象

  @Test

  public void testJpaSpecificationExecutor(){

  int pageNo = 3;

  int pageSize = 5;

  PageRequest pageable = new PageRequest(pageNo, pageSize);

  Specification specification = new Specification() {

  /**

  * @param root 代表查询的实体类

  * @param criteriaQuery 可以从中得到root对象,即告知 JPA Criteria 查询哪个实体类,

  * 还可以添加查询条件,还可以结合EntityManager对象得到最终查询的 TypedQuery

  * @param criteriaBuilder 用于创建criteria工厂

  * @return Predicate类型,代表一个查询条件

  */

  @Override

  public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) {

  Predicate predicate = criteriaBuilder.ge(root.get("id"),5);

  return predicate;

  }

  };

  Page page = personRepository.findAll(specification, pageable);

  System.out.println(page.getNumberOfElements());

  System.out.println(page.getContent());

  }

  自定义 Repository 方法

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

  创建一个 XXXDAO 接口,声明接口方法。

  创建一个 XXXRepository 接口,并继承 XXXDAO 接口。

  提供 XXXRepository 的实现类 XXXRepositoryImpl,并实现 XXXDAO 定义的接口方法。

  实际上在使用 XXXRepository 的自定义方法时会调用 XXXRepositoryImpl 中的实现。

  为所有的 Repository 都添加自实现的方法

  创建一个 XXXRepository 接口,需要继承 创建一个 Repository 接口。

  提供 XXXRepository 的实现类 XXXRepositoryImpl,且继承 SimpleJpaRepository,并提供方法的实现。

  定义 JpaRepositoryFactoryBean 的实现类,使其生成 XXXRepository 的接口实现类的对象。

  修改 \ 节点的 factory-class 属性指向 JpaRepositoryFactoryBean 的实现类的全类名。

  注意:

  全局的扩展实现类不要用 Imp 作为后缀名,

  或者为全局扩展接口添加 @NoRepositoryBean注解告知 SpringData 不要把其作为 Repository。

看Spring Data如何简化数据操作的更多相关文章

  1. 使用Spring Data JPA进行数据分页与排序

    一.导读 如果一次性加载成千上万的列表数据,在网页上显示将十分的耗时,用户体验不好.所以处理较大数据查询结果展现的时候,分页查询是必不可少的.分页查询必然伴随着一定的排序规则,否则分页数据的状态很难控 ...

  2. 【spring data jpa】使用spring data jpa 的删除操作,需要加注解@Modifying @Transactional 否则报错如下: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call

    使用spring data jpa 的删除操作,需要加注解@Modifying     @Transactional 否则报错如下: No EntityManager with actual tran ...

  3. 转:使用 Spring Data JPA 简化 JPA 开发

    从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...

  4. 使用 Spring Data JPA 简化 JPA 开发

    从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...

  5. Spring Data R2DBC响应式操作MySQL

    1. 前言 在使用R2DBC操作MySQL数据库 一文中初步介绍了r2dbc-mysql的使用.由于借助DatabaseClient操作MySQL,过于初级和底层,不利于开发.今天就利用Spring ...

  6. spring data jpa使用懒操作

    如果model对象的某属性使用lazy load,调用这个属性时会报错, failed to lazily initialize a collection of role could not init ...

  7. spring data jpa的update操作

    简介 使用jpa进行update操作主要有两种方式: 1.调用保存实体的方法 1)保存一个实体:repository.save(T entity) 2)保存多个实体:repository.save(I ...

  8. Spring Data ElasticSearch的使用

    1.什么是Spring Data Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务. S ...

  9. Spring Boot使用Spring Data Jpa对MySQL数据库进行CRUD操作

    只需两步!Eclipse+Maven快速构建第一个Spring Boot项目 构建了第一个Spring Boot项目. Spring Boot连接MySQL数据库 连接了MySQL数据库. 本文在之前 ...

随机推荐

  1. 在头文件#pragma comment(lib,"glaux.lib");编译器提示waring C4081: 应输入“newline“

    在头文件#pragma comment(lib,"glaux.lib");编译器提示waring C4081: 应输入“newline“ #行不能加分号的

  2. vs2008工程部署不成功,可能是远程文件路径出现问题

    解决方法: 修改工程属性页的配置属性 调试中的远程可执行文件的路径 部署中的远程目录的路径

  3. 1004 n^n的末位数字

    题目来源: Author Ignatius.L (Hdu 1061) 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题   给出一个整数N,输出N^N(N的N次方)的十 ...

  4. Objective-C中的字符串格式化输出(转载)

    转自:http://www.cnblogs.com/jackbutler/archive/2012/04/05/2432828.html %@ 对象 %d, %i 整数 %u 无符整形 %f 浮点/双 ...

  5. sourceTree 的使用

    一.拉取其他分支代码 1.git clone 代码是下载master分支 2.在未做修改的情况下,合并分支 二.提交代码到其他分支 1.创建分支(名称可以与远程不同) 2.(正常提交步骤)将作出的修改 ...

  6. django url 规则正确,却一直匹配错误,django url匹配错误的可能原因

    首先看一下我想要匹配的规则如下 这个url之前设计的是 joke/index/ 后来需要加page参数就把'/'去掉了 然后再用 joke/index去访问页面时总显示 当我把鼠标放到对应连接时,显示 ...

  7. bzoj 4036: [HAOI2015]按位或【min-max容斥+FWT】

    其实也不是FWT--我也不知道刷FWT专题问什么会刷出来这个东西 这是min-max容斥讲解:https://www.zybuluo.com/ysner/note/1248287 总之就是设min(s ...

  8. Windows API 搭建OpenGL窗口

    步骤: 1.创建windows窗口,得到窗口句柄hwnd 2.获取该窗口的设备环境hDC(当然也可以获取其他的设备环境,但我们一般是在创建的窗口上绘制) 3.创建OpenGL绘制环境RC,这个只能从h ...

  9. zabbix网络发现主机

    1 功能介绍 默认情况下,当我在主机上安装agent,然后要在server上手动添加主机并连接到模板,加入一个主机组. 如果有很多主机,并且经常变动,手动操作就很麻烦. 网络发现就是主机上安装了age ...

  10. C++命名空间详解

    使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突.在C++中,变量.函数和类都是大量存在的.如果没有命名空间,这些变量.函数.类的名称将都存在于全局命名空间中,会导致很多冲突.比如,如果我 ...