1. 程式人生 > 其它 >Spring Data JPA相關——初識Spring Data JPA

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);
    }
}

執行結果