Spring Data JPA相關——初識Spring Data JPA
Spring Data JPA相關——初識Spring Data JPA
什麼是JPA?
JPA指Java Persistence API,用於物件持久化的 API。JPA可以說是一種規範,是Java EE 5.0 平臺標準的 ORM 規範,使得應用程式以統一的方式訪問持久層。
像Hibernate,TopLink,Mybatis這些ORM框架可以說是JPA的實現。
spring data jpa和hibernate
- hibernate
Hibernate是一個開放原始碼的物件關係對映框架,對JDBC進行了非常輕量級的物件封裝,使得Java程式設計師可以隨心所欲就地使用 物件程式設計思維來提縱資料庫,並且物件有自己的生命週期,著力物件與物件之間的關係,有自己的HQL查詢語言,所以資料庫移 植性很好。Hibemate是完備的ORM框架,是符合JPA規範的。Hibemate有自己的快取機制。從上手的角度來說比較難,比較適合 企業級的應用系統開發。
- Spring Data JPA
可以理解為JPA規範的再次封裝抽象,底層還是使用了Hibernate 的JPA技術實現,引用JPQL (Java Persistence Query Language) 查 詢語言,屬於Spring整個生態體系的一部分。隨著Spring Boot和Spring Cloud在市場上的流行,Spring Data JPA也逐漸進入大家 的視野,它們組成有機的整體,使用起來比較方便,加快了開發的效率,使開發者不需要關心和配置更多的東西,完全可以沉浸 在Spring的完整生態標準實現下。JPA上手簡單,開發效率高,對物件的支援比較好,又有很大的靈活性,市場的認可度越來越高。
Spring Data Jpa | Mybatis | |
---|---|---|
單表操作 | 只需繼承,程式碼量極少,非常方便。而且支援方法名用關鍵字生成SQL | 可以使用程式碼生成工具,也很方便,但相對JPA單表弱很多。 |
多表關聯查詢 | 友好,動態SQL使用不夠方便,而且SQL和程式碼耦合到一起 | 非常友好,可以有非常直觀的動態SQL |
自定義SQL | SQL寫在註解裡面,寫動態SQL比較麻煩 | SQL可以寫在XML裡面,獨立管理,動態SQL語法也容易理解 |
學習成本 | 略高 | 較低,因為Mybatis佔有的市場更大,所以網路上的資料更多 |
Spring Data JPA的主要類和結構圖
- 需要掌握和使用到的類
七個大 Repository 介面:
- Repository(org.springframework.data.repository)
- CrudRepository(org.springframework.data.repository)
- PagingAndSortingRepository(org.springframework.data.repository)
- JpaRepository(org.springframework.data.jpa.repository)
- QueryByExampleExecutor(org.springframework.data.repository.query)
- JpaSpecificationExecutor(org.springframework.data.jpa.repository)
- QueryDslPredicateExecutor(org.springframework.data.querydsl)
兩大 Repository 實現類:
- SimpleJpaRepository(org.springframework.data.jpa.repository.support)
- QueryDslJpaRepository(org.springframework.data.jpa.repository.support)
類的結構關係圖
spring data jpa入門
建立一個spring boot專案
4.1配置工作
-
準備環境
-
JDK8+
-
Maven3+
-
Intellij IDEA
-
Spring Boot2+
-
MySQL8+
-
Spring Data JPA
-
maven依賴,pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
- application.properties
# 應用名稱
spring.application.name=springdatajpaTest
# 應用服務 WEB 訪問埠
server.port=8080
# 資料庫驅動
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 資料來源名稱
spring.datasource.name=defaultDataSource
# 資料庫連線地址
spring.datasource.url=jdbc:mysql://localhost:3306/db_jpa_test?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
# 資料庫使用者名稱&密碼:
spring.datasource.username=root
spring.datasource.password=123
#spring data jpa配置
spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
#每次執行程式,沒有表時會建立表,如果物件發生改變會更新表結構,原有資料不會清空,只會更新(推薦使用)
spring.jpa.properties.hibernate.format_sql=true
#log配置
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=trace
spring.jpa.hibernate.ddl-auto 是hibernate的配置屬性,其主要作用是:自動建立、更新、驗證資料庫表結構。該引數的幾種 配置如下:
- create :每次載入hibernate時都會刪除上一次的生成的表,然後根據你的實體類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執行,這就是導致資料庫表資料丟失的一個重要原因。
- create-drop :每次載入hibernate時根據model類生成表,但是sessionFactory一關閉,表就自動刪除。
- update :最常用的屬性,第一次載入hibernate時根據model類會自動建立起表的結構(前提是先建立好資料庫),以後 載入hibernate時根據model類自動更新表結構,即使表結構改變了但表中的行仍然存在不會刪除以前的行。要注意的是當部署到伺服器後,表結構是不會被馬上建立起來的,是要等應用第一次執行起來後才會。
- validate :每次載入hibernate時,驗證建立資料庫表結構,只會和資料庫中的表進行比較,不會建立新表,但是會插入新值。
4.2 建立實體類
@Entity
@Table(name = "tb_users")
@Setter
@Getter
@ToString
@NoArgsConstructor
public class User {
@Id
@GenericGenerator(name = "idGenerator", strategy = "uuid")
@GeneratedValue(generator = "idGenerator")
private String id;
@Column(name = "username", unique = true, nullable = false, length = 64)
private String username;
@Column(name = "password", nullable = false, length = 64)
private String password;
@Column(name = "email", length = 64)
private String email;
}
4.3 建立實體類對應介面
public interface UserRepository extends JpaRepository<User, String> {
}
4.4 執行測試
配置完成後,建立專案連線的資料庫,執行專案,如果成功的話,會發現資料庫中會建立好實體類對應的表
表的欄位屬性和實體類中的設定是對應的
現在嘗試插入一條資料,只需要建立實體類的物件,然後呼叫對應介面類的save方法
測試類
@SpringBootTest
public class UserTest {
@Autowired
private UserRepository userRepository;
@Test
public void add(){
User user = new User();
user.setUsername("zhanghua");
user.setPassword("2333");
user.setEmail("[email protected]");
userRepository.save(user);
}
}
執行結果