JPA相关

无人久伴 提交于 2020-02-25 21:27:50

全称Java Persistence API,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中

JPA仅仅是一种规范,也就是说JPA仅仅定义了一些接口,而接口是需要实现才能工作的。所以底层需要某种实现,而Hibernate就是实现了JPA接口的ORM框架。

Spring Data JPA 可以理解为 JPA 规范的再次封装抽象,底层还是使用了 Hibernate 的 JPA 技术实现

注解
含义
参数
声明类为实体或表。
 
数据库对应的表
name表明;indexs{@index索引,name索引名称,unique唯一索引,columnList索引列名}
@EntityListeners
用于指定Entity或者superclass上的回调监听类
AuditingEntityListener.class用于捕获监听信息,当Entity发生持久化和更新操作时
列注解
length 长度
@Type
hibernate中的type
type项目中自己实现的enum类名,所有的enum类都必须继承
@CreatedBy
创建者
 
@CreatedByDate
创建时间
 
@LastModifiedBy
最后修改人
 
@LastModifiedDate
最后修改时间
 
@OneToMany
一对多
cascade级联操作, FetchType加载方式,mappedBy指定实体属性名(与下方可不共用)
@JoinCloum
关联字段
 
对于查询而言,通过JPA官方文档我整理了下jpa命名规则:
官方文档的例子:
interface PersonRepository extends Repository<User, Long> {


  List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);
  findByEmailAddressAndLastname:findBy字段1And字段2

  // Enables the distinct flag for the query
  List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
  List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);
  Distinct关键字去重的意思,or是或者的意思,如果对sql很熟悉的人来说一眼就看明白了

  // Enabling ignoring case for an individual property
  // 对单个属性启用忽略大小写
  List<Person> findByLastnameIgnoreCase(String lastname);

  // Enabling ignoring case for all suitable properties
  // 对所有合适的属性启用忽略大小写
  List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);


  // Enabling static ORDER BY for a query
  // 为查询启用静态ORDER BY
  List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
  List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
}

 在查询方法中使用分页,切片和排序

Page<User> findByLastname(String lastname, Pageable pageable);

Slice<User> findByLastname(String lastname, Pageable pageable);

List<User> findByLastname(String lastname, Sort sort);

List<User> findByLastname(String lastname, Pageable pageable);

使用 top 和 first 限制查询的结果size(top,first使用效果相同)

User findFirstByOrderByLastnameAsc();

User findTopByOrderByAgeDesc();

Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);

Slice<User> findTop3ByLastname(String lastname, Pageable pageable);

List<User> findFirst10ByLastname(String lastname, Sort sort);

List<User> findTop10ByLastname(String lastname, Pageable pageable);

通过使用java8 stream特性查询(注:并非将查询结果包装在Stream中,而是使用特定于数据存储的方法来执行流传输)

@Query("select u from User u")
Stream<User> findAllByCustomQueryAndStream();

Stream<User> readAllByFirstnameNotNull();

@Query("select u from User u")
Stream<User> streamAllPaged(Pageable pageable);

//……. more functionality omitted.

如果需要构建复杂的sql的话需要使用到Specification

public static Specification<Customer> hasSalesOfMoreThan(MontaryAmount value) {
    return new Specification<Customer>() {
      public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query,
            CriteriaBuilder builder) {
         // build query here
      }
    };
  }

 

持久层框架对比:
springDataJPA
优点:
1.提供封装好的CURD操作,只需要遵循语法就可使用
2.明确的一对多,多对一,多对多关系映射
3.一般结合hibernate一起使用
缺点:              
1.JPA是一个规范不是一个产品,不同的提供商API略有差异
2.对与复杂的sql查询如果对JPA了解不是特别多就比较麻烦
 
mybatis
优点:
1. 由于自己掌握 SQL ,因此可以写出更加优质的 SQL ,提高 SQL 的执行效率
2.对于多表查询的话要比较简单
3.不需要明确一对多 多对一 多对多的关系对应
缺点:
1. 对SQL语句依赖程度很高;并且属于半自动,数据库移植比较麻烦,比如mysql数据库编程Oracle数据库,部分的sql语句需要调整。
2. 拼接复杂SQL语句时,没有代码灵活,拼写比较复杂。
 
 
现在出来mybatis-plus、或者是mybatis与jpa结合的方式来进行选择。所有的框架都有自己亮点的一面,不能一棒子打死,各有各的有点的!
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!