# [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/)