1 什么是JPA
JPA(Java Persistence API)是用于管理Java EE和Java SE中的持久化,以及对象/关系映射的Java API
相关实现:ElicpseLink、Hibernate、Apache OpenJPA
2 JPA核心概念
实体表示关系数据库中的表(即Entity)
每个实体实例对应于该表中的行
类必须用 javax.persistence.Entity 注解即 @Entity
类必须有一个 public 或 protected 的无参构造函数
实体实例被当作值以分离对象方式进行传递(例如通会话远程业务接口),则该类必须实现Serializable接口
唯一的对象标识符:简单主键(javax.persistence.Id)、复合主键(javax.persistence.EmbeddedId 和javax.persistence.IdClass)即 @Id
关系
一对一:@OneToOne
一对多:@OneToMany
多对一:@ManyToOne
多对多:@ManyToMany
3 EntityManager接口
定义用于与持久性上下文进行交互的方法
创建和删除持久实体实例,通过实体的主键查找实体
允许在实体上运行查询
获取EntityManager实例
@PersistenceUnit
EntityManagerFactory emf
;
EntityManager em
;
@Resource
UserTransaction utx
;
...
em
= emf
.createEntityManager();
try {
utx
.begin();
em
.persist(someEntity
);
em
.merge(AnotherEntity
);
em
.remove(ThirdEntity
);
utx
.commit();
} catch(Exception e
) {
utx
.rollback();
}
查找实体
@PersistenceContext
EntityManager em
;
public void enterOrder(int custID
, CustomerOrder newOrder
) {
Customer cust
= em
.find(Customer
.class, custID
);
cust
.getOrders().add(newOrder
);
newOrder
.setCustomer(cust
);
}
4 Spring Data JPA常用接口
CrudRepository(Crud增删改查)
public interface CrudRepository<T
, ID
extends Serializable> extends Repository<T, ID> {
<S
extends T> save(S entity
);
T
findOne(ID primaryKey
);
Iterable
<T> findAll();
Long
count();
void delete(T entity
);
boolean exists(ID primaryKey
);
}
PagingAndSortingRepository
public interface PagingAndSortingRepository<T
, ID
extends Serializable> extends CrudRepository<T, ID> {
Iterable
<T> findAll(Sort sort
);
Page
<T> findAll(Pageable pageable
);
}
根据方法名创建查询
public interface PersonRepository extends Repository<User, Long> {
List
<Person> findByEmailAddressAndLastname(EnailAddress emailAddress
, String lastname
);
List
<Person> findDistinctPeopleByLastnameOrFirstname(String lastname
, String firstname
);
List
<Person> findPeopleDisinctByLastnameOrFirstname(String lastname
, String firstname
);
List
<Person> findByLastnameIgnoreCase(String lastname
);
List
<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname
, String firstname
);
List
<Person> findByLastnameOrderByFirstnameAsc(String lastname
);
List
<Person> findByLastnmaeOrderByFirstnameDes(String lastname
);
}
5 项目中配置Spring Data JPA
pom.xml中依赖
<!-- 数据库JPA
-->
<dependency>
<groupId>org
.springframework
.boot
</groupId
>
<artifactId>spring
-boot
-starter
-data
-jpa
</artifactId
>
</dependency
>
<!-- mysql数据库连接
-->
<dependency>
<groupId>mysql
</groupId
>
<artifactId>mysql
-connector
-java
</artifactId
>
</dependency
>
application.properties或application.yml中添加mysql和jpa的参数:
spring
:
datasource
:
driver
-class-name
: com
.mysql
.jdbc
.Driver
url
: jdbc
:mysql
://localhost
:3306/thymeleaf
?charsetEncoding
=utf
-8&useSSL
=false
username
: root
password
: root
jpa
:
show
-sql
: true
hibernate
:
ddl
-auto
: update
声明创建表实体
@Entity
public class User {
@Id
private Long id
;
private String username
;
private String email
;
public User() {}
public User(Long id
, String username
, String email
) {
this.id
= id
;
this.username
= username
;
this.email
= email
;
}
public Long
getId() {
return id
;
}
public void setId(Long id
) {
this.id
= id
;
}
public String
getUsername() {
return username
;
}
public void setUsername(String username
) {
this.username
= username
;
}
public String
getEmail() {
return email
;
}
public void setEmail(String email
) {
this.email
= email
;
}
}
创建表的Repository
public interface UserRepository extends JpaRepository<User, Long> {
}