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> {
// 方法名对应sql查询的关键字:
// findBy:根据什么查询
// And:多个查询条件
// Or:一个或多个查询条件
// IgnoreCase:忽略大小写
// AllIgnorecase:忽略所有大小写,在多个条件的情况下使用
// OrderBy:根据什么排序,在方法名最后追加上要使用的排序方式,Asc为升序排序,Des为降序排序
List<Person> findByEmailAddressAndLastname(EnailAddress emailAddress, String lastname);
// 启动distinct去重,因为条件有可能通过Lastname或者Firstname都查询到可能有重复,所以要去重
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> {
}