1. 程式人生 > 實用技巧 >SpringBoot整合Spring Data JPA

SpringBoot整合Spring Data JPA

目錄

本篇要點

  • 簡單介紹JPA。

  • 介紹快速SpringBoot快速整合JPA

JPA是啥?

The Java Persistence API is a standard technology that lets you “map” objects to relational databases. The spring-boot-starter-data-jpa POM provides a quick way to get started.

  • JPA是The Java Persistence API標準,Java持久層API,是一種能讓物件能夠快速對映到關係型資料庫的技術規範。
  • JPA只是一種規範,它需要第三方自行實現其功能,在眾多框架中Hibernate是最為強大的一個。

Spring Data JPA

Spring Data JPA 是採用基於JPA規範的Hibernate框架基礎下提供了Repository層的實現。Spring Data Repository極大地簡化了實現各種持久層的資料庫訪問而寫的樣板程式碼量,同時CrudRepository提供了豐富的CRUD功能去管理實體類。SpringBoot框架為Spring Data JPA提供了整合,spring-boot-starter-data-jpa

能夠讓你快速使用這門技術,它提供了以下依賴。

  • Hibernate:最流行的JPA實現之一。
  • Spring Data JPA:幫助你去實現JPA-based repositories。
  • Spring ORM:Spring Framework提供的核心ORM支援。

快速SpringBoot快速整合JPA

引入依賴

        <!--SpringBoot對jpa的封裝-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!--mysql驅動,8.x版本-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

配置yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/jpa?serverTimezone=GMT%2B8
    username: root
    password: 123456
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5
  jpa:
    #在建表的時候,將預設的儲存引擎切換為 InnoDB
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    # 配置在日誌中打印出執行的 SQL 語句資訊。
    show-sql: true
    # 配置指明在程式啟動的時候要刪除並且建立實體類對應的表。
    hibernate:
      ddl-auto: create #update

值得注意的是:spring.jpa.hibernate.ddl-auto第一建表的時候可以create,指明在程式啟動的時候要刪除並且建立實體類對應的表。後續使用就需要改為update。

ddl-auto的幾種屬性值

  • create:每次載入hibernate時都會刪除上一次的生成的表,再重新根據model生成表,因此可能會導致資料丟失。
  • create-drop :每次載入hibernate時根據model類生成表,但是sessionFactory一關閉,表就自動刪除
  • update:最常用的屬性,第一次載入hibernate時根據model類會自動建立起表的結構(前提是先建立好資料庫),以後載入hibernate時根據 model類自動更新表結構,原有資料不會清空,只會更新。
  • validate :每次載入hibernate時,會校驗資料與資料庫的欄位型別是否相同,欄位不同會報錯

實體類

JPA規範定義在javax.persistence包下,注意導包的時候不要導錯。

@Entity(name = "t_user")
@Data
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;
    private String password;


    @Transient
    private String email;

}
  • @Entity標註保證實體能夠被SpringBoot掃描到,對應表名為t_user

  • @Id表明id。

  • @GeneratedValue中標註主鍵生成策略。

  • @Transient表示不需要對映的欄位。

常見的主鍵生成策略

  • TABLE: 使用一個特定的資料庫表格來儲存主鍵
  • SEQUENCE: 根據底層資料庫的序列來生成主鍵,條件是資料庫支援序列。這個值要與generator一起使用,generator 指定生成主鍵使用的生成器(可能是orcale中自己編寫的序列)。
  • IDENTITY: 主鍵由資料庫自動生成(主要是支援自動增長的資料庫,如mysql)
  • AUTO: 主鍵由程式控制,也是GenerationType的預設值。

啟動專案,生成表

首先在資料庫中建立jpa庫,庫名無所謂,和配置對應上就可以。

啟動專案,你會發現控制檯輸出日誌如下:

Hibernate: drop table if exists t_user
Hibernate: create table t_user 
    (id bigint not null auto_increment, password varchar(255), username varchar(255), primary key (id)) engine=InnoDB

此時我們配置的create效果已經顯現,我們之後將它改為update,不然每次啟動程式,資料表又得重建咯。

資料訪問層

Working with Spring Data Repositories

Spring Data JPA repositories是你可以定義訪問資料的介面,JPA查詢是根據你的方法名稱自動建立的。

這裡我們編寫一個介面,繼承JpaRepository即可。User是物件名,不是表名,Long為主鍵的型別。

public interface UserDao extends JpaRepository<User, Long> {

    /**
     * 根據使用者名稱和密碼查詢使用者
     */
    User findByUsernameAndPassword(String username, String password);
}

JPA預設支援常見的增刪改查,也支援findByUsernameAndPassword這種以欄位命名的方法,對於更復雜的查詢,您可以使用Spring Data的Query註解對方法進行註解。

測試JPA

@SpringBootTest
class SpringBootJpaApplicationTests {

    @Resource
    UserDao userDao;

    @Test
    void testJPA() {
        User user = userDao.save(new User(null, "summerday", "123456", "hangzhou"));
        System.out.println("新增使用者: " + user);
        User u = userDao.findByUsernameAndPassword("summerday", "123456");
        System.out.println("根據使用者名稱和密碼查詢使用者: " + u);
        long count = userDao.count();
        System.out.println("當前使用者數量: " + count);
        PageRequest page = PageRequest.of(0, 5, Sort.by(Sort.Order.desc("id")));
        Page<User> all = userDao.findAll(page);
        System.out.println("分頁 + 根據id逆序 查詢結果: " + all.getContent());
        if(userDao.existsById(u.getId())) {
            userDao.deleteById(u.getId());
            System.out.println("刪除id為" + u.getId()+ "的使用者成功");
        }
        long c = userDao.count();
        System.out.println("剩餘使用者數為: " + c);
    }
}

控制檯輸出如下:

五、原始碼下載

本文內容均為對優秀部落格及官方文件總結而得,原文地址均已在文中參考閱讀處標註。最後,文中的程式碼樣例已經全部上傳至Gitee:https://gitee.com/tqbx/springboot-samples-learn,另有其他SpringBoot的整合哦。

參考閱讀