每天叫醒你的不是闹钟,而是姿势
1
前言
在介绍Spring Dara Jpa之前,我们首先认识HIbernate。Hibernate是数据访问解决技术的绝对霸主,使用ORM映射技术实现数据访问,ORM映射将领域模型类和数据库的表进行映射,通过程序操作对象而实现表数据操作的能力,让数据访问操作无需关注数据库相关的技术。
随着Hibernate的盛行,Hibernate主导了EJB3.0的JPA规范,即Java Persistence API。JPA是一个基于ORM映射的标准规范。所谓规范即只定义标准规则,不提供实现,软件提供商可以按照标准规范来实现,而使用者只需按照规范中定义的方式来使用。Spring Data JPA是Spring Data 的一个子项目,它通过提供基于JPA的Reposistory极大地减少了JPA作为数据访问方案的代码量。
2
Spring Data 家族
Spring Data 包含的子项目
Commons - 提供共享的基础框架,适合各个子项目使用,支持跨数据库持久化
Hadoop - 基于 Spring 的 hadoop 作业配置和一个 POJO 编程模型的 MapReduce 作业
Key-Value - 集成了 Redis 和 Riak ,提供多个常用场景下的简单封装
Document - 集成文档数据库:CouchDB 和 MongoDB 并提供基本的配置映射和资料库支持
Graph - 集成 Neo4j 提供强大的基于 POJO 的编程模型
Graph Roo AddOn - Roo support for Neo4j
JDBC Extensions - 支持 Oracle RAD、高级队列和高级数据类型
JPA - 简化创建 JPA 数据访问层和跨存储的持久层功能
Mapping - 基于 Grails 的提供对象映射框架,支持不同的数据库
Examples - 示例程序、文档和图数据库
Guidance - 高级文档
Spring Data Commons
Spring Data Commons 是上述各种Spring Data项目的依赖,它是Spring Data Repository的抽象。我们翻开源码看一下Spring Data Repository抽象的根接口
Repository接口:
package org.springframework.data.repository;
import java.io.Serializable;
public interface Repository<T, ID extends Serializable> {
}
源码中看出,它接受领域类和领域类的id类型作为类型参数。
我们查看子接口CrudReposotory(IDEA快捷键ctrl + alt + B)
package org.springframework.data.repository;
import java.io.Serializable;
@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
<S extends T> S save(S var1);
<S extends T> Iterable<S> save(Iterable<S> var1);
T findOne(ID var1);
boolean exists(ID var1);
Iterable<T> findAll();
Iterable<T> findAll(Iterable<ID> var1);
long count();
void delete(ID var1);
void delete(T var1);
void delete(Iterable<? extends T> var1);
void deleteAll();
}
从源码看到该接口定义了CRUD操作相关的内容
继续查看子接口PagingAndSortingRepository
package org.springframework.data.repository;
import java.io.Serializable;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
Iterable<T> findAll(Sort var1);
Page<T> findAll(Pageable var1);
}
该接口定义了分页与排序操作相关的内容
当然,Spring Data 项目还给我们定义了一个功能,根据属性名进行计数、删除、查询等方法(这里不做详解)
3
Spring Data JPA
使用Spring Data JPA建立数据访问层十分简单,只需定义一个继承JpaRepository的接口即可。
package com.zero.spring_data_jpa.dao;
import com.zero.spring_data_jpa.entity.Person;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* @Author: Zero
* @Date: 2019/4/9 23:32
*/
public interface PersonRepository extends JpaRepository<Person, Long> {
}
继承JpaRepository接口之后,翻开源码,我们看到我们的接口已经默认有了下面的数据访问操作方法:
package org.springframework.data.jpa.repository;
import java.io.Serializable;
import java.util.List;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;
@NoRepositoryBean
public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {
List<T> findAll();
List<T> findAll(Sort var1);
List<T> findAll(Iterable<ID> var1);
<S extends T> List<S> save(Iterable<S> var1);
void flush();
<S extends T> S saveAndFlush(S var1);
void deleteInBatch(Iterable<T> var1);
void deleteAllInBatch();
T getOne(ID var1);
}
那么我们可以在service的实现层直接调用该接口的方法进行简单的CRUD操作。
历史文章
点击蓝字关注我们