Spring:SpringDataJPA

本文深入探讨Spring Data JPA的核心概念与实现原理,解析其与JPA、Hibernate的关系,介绍如何通过方法名和注解自定义查询,以及如何利用Example进行复杂查询。此外,还详细讲解了Entity的状态管理和更新机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面

设定范围–>Spring-Data-Comment

基础概念

JPA :Java Persistence API Java持久化对象
API : application program interface 应用程序接口
HibernateJPA : Hibernate 实现了JPA接口,符合JPA规范
SpringDataJPA: 对JPA规范的再次封装,整合到Spring-Data项目中.
主要SpringData子项目:
Spring Data Commons
Spring Data Gemfire
Spring Data JPA
Spring Data KeyValue
Spring Data LDAP
Spring Data MongoDB
Spring Data REST
Spring Data Redis
Spring Data for Apache Cassandra
Spring Data for Apache Solr

  • JPA和Hibernate以及SpringDataJPA的关系

在这里插入图片描述

SpringData实现原理

上面说了SpringDataJPA的Spring为了实现JPA的所有接口实现统一而设立的项目,Spring-Data-Comment,是所有项目的基础,所有了解这个基础是了解整个JPA生态的基石.
在Spring Data Common这个基础包下面的核心部分:七个核心接口和2个实现类

  • 需要了解到的接口和类

七个核心接口

	//所有接口的起源,没有定义方法,只是起到标识作用
 	Repository (org.springframework.data.repository)
 	//定义了基础的CRUD方法
   CrudRepository (org.springframework.data.repository)
   //主要是分页和排序的方法
   PagingAndSortingRepository(org.springframework.data.repository)
   //通过Example来查询,不能实现Or链接
   QueryByExampleExecutor(org.springframework.data.repository.query)
   //JPA包中的类,面向关系型数据库进行的数据封装(包含分页排序和根据example查询)
   JpaRepository(org.springframework.data.jpa.repository)
   //规范,使用于实现复杂查询,需要了解Criteria概念
   JpaSpecificationExecutor(org.springframework.data.jpa.repository)
   //
   QueryDslPredicateExecutor(org.springframework.data.querydsl)

两个核心类

	//JPA的简单实现类
	SimpleJpaRepository(org.springframework.data.jpa.repository.support)
	QueryDslJpaRepository(org.springframework.data.jpa.repository.support)

简单的实现逻辑
在定义的repository接口中,通过继承接口比如CrudRepository,或者PagingAndSortingRepository接口,在DataJPA包中有一个SimpleJpaRepository类,它是实现了以上这些接口,也就是说可以通过反向代理+多态来实现接口指向实现类的引用来实现数据查询.
当然上面的实现原理是最初始的,如果通过方法名实现查询,或者通过注解实现查询,就需要进行解析,动态创建实例对象.也就是说
用户没有为每个自定义的JpaRepository接口提供实现类,但是Spring Data JPA 最终将每个这样的bean最终映射到了一个统一的实现类SimpleJpaRepository的代理对象,而这个代理对象能支持所有每个自定义的JpaRepository接口定义的功能和SimpleJpaRepository类中定义的所有功能。

通过方法名自定义查询
  • 首先需要进行查询策略的设置,@EnableJpaRepositories(queryLookupStrategy=???),问好里面的参数可以是三者之一:CREATE,通过方法名创建,USE_DECLARED_QUERY,通过注解里面的Sql进行查询,CREATE_IF_NOT_FOUND,默认查询策略,也就是两者都包含.
  • 根据方法名进行查询,方法解析器的解析算法拿到Path,跟数据库表所对应的类的属性进行匹配,来拿到确切的关键字来进行数据查询,同时要知道JPA中自定义的关键字会在前面进行拆分转为对应的Sql关键字.
根据注解查询
  • 需要掌握的有@Quary和@Parm注解
实践
  • 通过Example实现查询
		//这个Article 是实体类
	  Article article = new Article();
      article.setState(state);
      Example example = Example.of(article);
      return articleRepository.findAll(example);
  • 可以添加其他的查询条件:比如关键字
       Article article = new Article();
       article.setState(state);

       Example example = Example.of(article);
       if(!"".equals(keywords)&&keywords!=null){
       //如果关键字存在的话,就获取匹配器,设置文章名字段的匹配规则为包含关键字
           article.setTitle(keywords);
           example.getMatcher().withMatcher("title",
                   ExampleMatcher.GenericPropertyMatchers.contains());
       }
     return articleRepository.findAll(example,pageable);
JPA进阶

这个博客主要是讲JPA中的Entity的更新

  • 首先是Entity的四种状态:临时态,持久态,游离态,删除态
  • 只有持久态的实体的更新会与数据库中的数据保持一致,也就是自动更新.
  • EntityManage:这个是所有实体的管理器,用来维持所有的持就对象和数据库数据之间的关系.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝多芬也爱敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值