Spring Boot入門系列(二十六)超級簡單!Spring Data JPA 的使用!

之前介紹了Mybatis資料庫ORM框架,也介紹了使用Spring Boot 的jdbcTemplate 操作資料庫。其實Spring Boot 還有一個非常實用的數據操作框架:Spring Data JPA。

Spring Data JPA 是Spring Data框架下的一個基於JPA標準操作數據的模組,簡化了操作持久層的程式碼,只需要編寫介面就可以。如果你是第一次使用 Spring Data JPA ,你一定會驚呼這東西簡直就是神器,幾乎不需要寫什麼關於資料庫訪問的程式碼一個基本的 CURD 的功能就出來了。使用非常簡單方便,下面我們就來講述 JPA 使用的基本操作。

JPA 是 Spring Boot 官方推薦的資料庫訪問組件,其充分體現了面向對象編程思想,有點像 asp.net 的 EFCore。JPA 也是眾多 ORM 的抽象。

一、Spring Data JPA介紹

JPA (Java Persistence API), Java持久層 API的簡稱,是JDK 5.0註解或XML描述對象-關係表的映射關係,並將運行期的實體對象持久化到資料庫中,JPA是一個基於O/R映射的標準規範。

JPA的總體思想和現有Hibernate、TopLink、JDO等ORM框架大體一致。主要包括括以下3方面的技術:

  1. ORM映射元數據 將實體對象持久化到資料庫表中
  2. API,用來操作實體對象,執行CRUD操作
  3. 查詢語言,通過面向對象,而非面向資料庫的查詢語言查詢數據

Spring Data JPA 是 Spring 基於 ORM 框架、JPA 規範的基礎上封裝的一套JPA應用框架,可使開發者用極簡的程式碼即可實現對數據的訪問和操作。它提供了包括增刪改查等在內的常用功能,且易於擴展!學習並使用 Spring Data JPA 可以極大提高開發效率。

SpringData:其實Spring Data 就是Spring提供了一個操作數據的框架。而Spring Data JPA只是Spring Data框架下的一個基於JPA標準操作數據的模組。

 

二、SpringBoot整合SpringData JPA

1、增加JPA的相關依賴

在pom.xml 中,增加如下配置:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

注意,需要添加MySql驅動。

 

2、修改配置文件

需要在application.properties 中配置數據源和jpa的基本的相關屬性,具體如下:

#資料庫連接
spring.datasource.url=jdbc:mysql://localhost:3306/zwz_test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#jpa配置
spring.jpa.properties.hibernate.hbm2ddl.auto=create
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
#SQL 輸出
spring.jpa.show-sql=true
#format 下 SQL 進輸出
spring.jpa.properties.hibernate.format_sql=true

在上面的參數設置說明下:

  1、spring.jpa.properties.hibernate.hbm2ddl.auto: 配置實體類維護資料庫表結構的具體行為,

  • update:最常用的屬性,表示當實體類的屬性發生變化時,表結構跟著更新;
  • create:表示啟動的時候刪除上一次生成的表,並根據實體類重新生成表,這個時候之前表中的數據就會被清空;
  • create-drop:表示啟動時根據實體類生成表,但是當sessionFactory關閉的時候表會被刪除;
  • validate:表示啟動時驗證實體類和數據表是否一致;
  • none:則什麼都不做。

  2、spring.jpa.show-sql :表示hibernate在操作的時候在控制台列印真實的sql語句,方便調試。

  3、spring.jpa.properties.hibernate.format_sql:表示格式化輸出的json字元串,方便查看。

  4、spring.jpa.properties.hibernate.dialect:指定⽣成表名的存儲引擎為 InneoDB 

 

3、資料庫實體類

資料庫實體類是一個 POJO Bean 對象。定義實體類後,在項目啟動時,系統會根據實體類創建對應的數據表,實體類如下:

package com.weiz.pojo;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * 用戶實體類
 *
 * @author
 * @since
 */
@Entity
@Table(name = "Users")
public class Users {
    @Id
    private Long id;

    @Column(length = 32)
    private String name;

    @Column(length = 32)
    private String account;

    @Column(length = 64)
    private String pwd;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

程式碼說明:

  @Entity:必選的註解,聲明這個類對應了一個資料庫表。
  @Table:可選的註解。聲明了資料庫實體對應的表資訊。包括表名稱、索引資訊等。這裡聲明這個實體類對應的表名是 Users。如果沒有指定,則表名和實體的名稱保持一致,跟@Entity 註解配合使用
  @Id註解:聲明了實體唯一標識對應的屬性,。
  @Column註解:用來聲明實體屬性的表欄位的定義。默認的實體每個屬性都對應了表的一個欄位。欄位的名稱默認和屬性名稱保持一致(並不一定相等)。欄位的類型根據實體屬性類型自動推斷。這裡主要是聲明了字元欄位的長度。如果不這麼聲明,則系統會採用 255 作為該欄位的長度。

注意:這些註解是建立基於 POJO 的實體對象,需要注意的是 JPA 與 Mybatis 是有區別的。

 

4、運行驗證

以上就是整合jpa的全部配置,配置完之後,啟動項目,我們就可以看到日誌中如下的內容:

 同時,連上資料庫之後,可以看到Users 表也創建成功了。

 

三、定義Repository 

項目整合 jpa 成功之後,接下來可以定義Repository 數據訪問介面了,只需要繼承 JpaRepository 類,就會幫我們自動生成很多內置方法,如下:

package com.weiz.dao;

import com.weiz.pojo.Users;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRespository extends JpaRepository<Users, Long> {

}

上面的程式碼可以看到,我們基本上一行程式碼也不用寫,就能實現Users 用戶的增刪改查等全部的方法。

 

四、如何調用

上面,我們創建了UserRespository 數據介面,接下來就來調用該介面實現簡單的增刪改查。

package com.weiz.controller;

import com.weiz.dao.UserRespository;
import com.weiz.pojo.Users;
import com.weiz.utils.JSONResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Optional;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserRespository userRespository;

    @RequestMapping("/save")
    public JSONResult save(){
        Users user = new Users();
        user.setId((long) 1);
        user.setName("spring boot jpa");
        user.setPwd("123456");
        userRespository.save(user);
        return JSONResult.ok("保存成功");
    }

    @RequestMapping("/update")
    public JSONResult update() {
        Users user = new Users();
        user.setId((long) 1);
        user.setName("spring boot jpa update");
        user.setPwd("123456");
        user.setAccount("sbj");
        userRespository.save(user);
        return JSONResult.ok("修改成功");
    }

    @RequestMapping("/delete")
    public JSONResult delete() {
        Users user = new Users();
        user.setId((long) 1);
        userRespository.delete(user);
        return JSONResult.ok("刪除成功");
    }

    @RequestMapping("/select")
    public JSONResult select() {
        Optional<Users> users = userRespository.findById((long) 1);
        return JSONResult.ok(users);
    }
}

以上的controller 就是簡單的調用增刪改查的方法。增加了對應的controller 之後,啟動項目即可測試用戶的增刪改查功能。這裡就不一一截圖了。

 

最後

以上就實現了spring boot 整合 jpa 操作資料庫,是不是特別簡單,整個過程我們所做的僅僅上面簡單的四步:

1、增加jpa的依賴

2、在配置文件中裡面增加資料庫配置資訊。

3、聲明一個 Users 的資料庫實體對象。

4、聲明了一個持久層的介面,繼承JpaRepository<T, ID> 介面。

這樣,整個用戶管理模組的增加、刪除、修改、查詢功能就實現了,甚至還有排序和分頁的功能。

這就是 JPA 的強大之處。除了這些介面外,用戶還會有其他的一些自定義的查詢需求, JPA 也一樣可以滿足你的需求。

這個系列課程的完整源碼,也會提供給大家。大家關注我的微信公眾號(架構師精進),回復:springboot源碼 ,獲取這個系列課程的完整源碼。