写在前面
设定范围–>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:这个是所有实体的管理器,用来维持所有的持就对象和数据库数据之间的关系.