Spring Data JPA

Spring Data

统一了持久层。
为什么要用Spring Data? 为什么不用JDBC,MyBatis?

如果我要实现一个电商里面的秒杀功能,并发量一般很高,单一的数据存储方案已经不能满足需求了。现在一般是不同的场景会用不同的数据存储方案。
比如我们可以把经常访问的数据也就是热点数据缓存在Redis中,然后可能还有mongoDB,neo4j等,对于开发人员来说要会的东西就更多了,所以我们就希望有一种似乎来统一操作各种不同的数据存储方案。
Spring Data 提供各种模板对象来进行数据存储的操作,总结一下就是:Spring Data致力于为数据访问也就是DAO提供熟悉且一致的基于Spring的编程模板和通用接口。其目的是统一和简化对不同类型持久性存储(关系和NoSQL)的访问。

Spring Data 主要模块

常见的有:

  • Spring Data common
  • Spring Data JDBC
  • Spring Data JPA
  • Spring Data MongoDB
  • Spring Data Redis
  • Spring Data REST

Spring Data 主要特性

  • 模板制作
  • 对象/数据存储映射
    可以通过XML/注解进行对象关系映射,都不用写SQL语句来,直接用类的方法就可以增删改查
JPA
@Entity
@Table(name="TUSER")
public class User {
  @Id
  private String id;
  @Column(name="fn")
  private String name;
  private Data lastLogin;

  @OneToMany
  private List<Role> roles;
}
  • Repository 支持
    Repository 提供了基本的数据访问功能,其几个字接口则扩展了一些功能。它们的继承关系如下:
    Respository: 仅仅是一个标识,表明任何继承它的均为仓库接口类
    CrudRepository: 继承 Repository, 实现了一组 CRUD 相关的方法
    PagingAndSortingRepository: 继承Repository, 实现了一组分页排序相关的方法
    JpaRepository: 继承 PagingAndSortingRepository, 实现一组 JPA 规范相关的方法

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

JPA和JDBC的关系

相同处:

  • 都和数据库操作有关,JPA是JDBC的升级版
  • JDBC和JPA都是一组规范接口
  • 都是由SUN官方推出的

不同处:

  • JDBC是由各个关系型数据库实现的,JPA是由ORM框架实现的。
  • JDBC使用SQL语句和数据库通信的,JPA用面向对象式,通过ORM框架来生成SQL,进行操作,所以也是要生成SQL然后通过JDBC去操作,只不过不用我们自己去做了,是框架做的。
  • JPA在JDBC之上的,JPA也要依赖JDBC才能操作数据库

JDBC的问题:

  • 得用SQL语句,有学习成本
  • 数据库的移植性不高,因为不同数据库的SQL语句会有不同
  • Java对象属性和数据库字段的映射麻烦

SUN在JDK1.5提出了JPA
JPA全称 Java Persistence API,是SUN官方提出的一种 ORM规范:Object Relational Mapping
SUN希望开发者能从JDBC和SQL代码中解脱出来,直接面向对象操作,并希望持久化技术能够统一,天下归一,如果你是基于JPA进行持久化你可以随意切换数据库。

Hibernate 与 JPA

Hibernate就是实现了JPA接口的ORM框架
也就是:JPA是一套ORM规范,Hibernate实现了JPA规范

MyBatis:小巧、方便、半自动的ORM框架
MyBatis: 就是jdbc的封装, 在国内更流行,因为国内的业务一般更复杂,很多场景需要自己写SQL才能实现,

Spring Data JPA

Spring Data JPA 是 Spring 提供的一套简化JPA开发的框架,按照约定好的规则进行方法命名去写DAO层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作,同时提供了很多除了CRUD之外的功能,例如分页,排序,复杂查询等。有了接口之后靠JDK的动态代理为接口增强。

也就是说现在的执行流程是:
Java Application --> Spring Data JPA. --> JPA -->JPA的实现(Hibernate) -->JDBC --> 数据库

例子:


SpringBoot创建的项目,JPA实现会自动依赖Hibernate

Spring Data JPA JavaConfig配置

使用Spring Data Repositories

Domain Driven Design

SpringBoot整合JPA

创建SpringBoot项目加入SpringData, SpringWeb, MySql Driver的场景启动器

Spring Data JPA 配置项

SpringBoot有很多自动配置类

自定义操作 JPQL和SQL

可以通过 SpringDataJPA提供的接口实现持久化操作,但是支持是有限的,如果想实现更复杂的持久化操作,需要自定义操作.
@Query

  • 查询如果返回单个实体,就用pojo接收,如果是多个需要通过集合
  • 参数设置方式
    1. 索引: ?数字
    2. 具名: :参数名。结合@Param注解指定参数名字
  • 增删改:
    1. 要加上事务的支持
    2. 如果是插入只能在hibernate支持下才行

最佳实践

posted @ 2022-01-13 10:02  Lylee  阅读(93)  评论(0编辑  收藏  举报