# [Spring Data JPA] 第一次使用 JPA
###### tags: `Spring` `Java` `Spring Data JPA`
[TOC]
JPA(Java Persistence API)是針對ORM提出的技術規範,目的在於簡化開發過程與整合市面上的ORM技術(Hirbernate、OpenJPA...等),減少開發人員存取資料庫的工作量。
>crud: `count()`、`existsById(ID id)`、`findAll(Specification<T> spec, Pageable pageable)`...等,繼承 JpaRepository 後不須實作上述方法也能使用。
## 1. 引入依賴
### MAVEN
```=xml!
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
```
### GRADLE
```=xml!
compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '2.2.6.RELEASE'
```
## 2. properties 設定
```
spring.jpa.hibernate.ddl-auto = none
```
* update:自動新增不存在的數據表,和字段。不會影響數據
* create:自動新建不存在的數據表,同時清空數據
* create-drop:同 create,同時在服務停止時 drop 所有表
* validate:只校驗,不修改表,可以自動校驗數據表字段是否映射到了 Entity
* none:不做任何事
資料來源: [(19) 導入Spring-Data-JPA,將資料庫與物件進行綁定與 Sequence 的設定](https://medium.com/learning-from-jhipster/19-%E5%B0%8E%E5%85%A5spring-data-jpa-%E5%B0%87%E8%B3%87%E6%96%99%E5%BA%AB%E8%88%87%E7%89%A9%E4%BB%B6%E9%80%B2%E8%A1%8C%E7%B6%81%E5%AE%9A%E8%88%87-sequence-%E7%9A%84%E8%A8%AD%E5%AE%9A-d96724c03458)
## 3. 實作 JpaRepository 介面
### 建立 Entity
```=java!
@Entity
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String firstName;
private String lastName;
@ManyToOne
private Country country;
private int age;
@CreatedDate
private LocalDateTime createdDate;
protected User() {}
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
//其他建構子
@Override
public String toString() {
return String.format("Customer[id=%d, firstName='%s', lastName='%s']",id, firstName, lastName);
}
//其他get、set
}
```
### 建立 Repository/Dao 繼承 JpaRepository
```=java
@Repository
public interface UserDao extends JpaRepository<User, Integer> {
List<User> findByCountryAndAgeLessThan(Country country, int age);
}
```
---
參考資料:
[Accessing Data with JPA](https://spring.io/guides/gs/accessing-data-jpa/)