全称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结合的方式来进行选择。所有的框架都有自己亮点的一面,不能一棒子打死,各有各的有点的!
来源:oschina
链接:https://my.oschina.net/Pirvate/blog/3159505