JPA相关

编程

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

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

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

注解

含义

参数

@Entity

声明类为实体或表。

 

@Table

数据库对应的表

name表明;indexs{@index索引,name索引名称,unique唯一索引,columnList索引列名}

@EntityListeners

用于指定Entity或者superclass上的回调监听类

AuditingEntityListener.class用于捕获监听信息,当Entity发生持久化和更新操作时

@Column

列注解

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结合的方式来进行选择。所有的框架都有自己亮点的一面,不能一棒子打死,各有各的有点的!

以上是 JPA相关 的全部内容, 来源链接: utcz.com/z/512815.html

回到顶部