之前介紹了Mybatis資料庫ORM架構,也介紹了使用Spring Boot 的jdbcTemplate 操作資料庫。其實Spring Boot 還有一個非常實用的資料操作架構:Spring Data JPA。
Spring Data JPA 是Spring Data架構下的一個基于JPA标準操作資料的子產品,簡化了操作持久層的代碼,隻需要編寫接口就可以。如果你是第一次使用 Spring Data JPA ,你一定會驚呼這東西簡直就是神器,幾乎不需要寫什麼關于資料庫通路的代碼一個基本的 CURD 的功能就出來了。使用非常簡單友善,下面我們就來講述 JPA 使用的基本操作。
一、Spring Data JPA介紹
JPA (Java Persistence API), Java持久層 API的簡稱,是JDK 5.0注解或XML描述對象-關系表的映射關系,并将運作期的實體對象持久化到資料庫中,JPA是一個基于O/R映射的标準規範。
JPA 是 Spring Boot 官方推薦的資料庫通路元件,其充分展現了面向對象程式設計思想,有點像 asp.net 的 EFCore。JPA 也是衆多 ORM 的抽象。
JPA的總體思想和現有Hibernate、TopLink、JDO等ORM架構大體一緻。主要包括括以下3方面的技術:
- ORM映射中繼資料 将實體對象持久化到資料庫表中
- API,用來操作實體對象,執行CRUD操作
- 查詢語言,通過面向對象,而非面向資料庫的查詢語言查詢資料
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源碼 ,擷取這個系列課程的完整源碼。
推薦閱讀:
SpringBoot從入門到精通(二十四)3分鐘搞定Spring Boot 多環境配置! SpringBoot從入門到精通(二十三)Mybatis系列之——實作Mybatis多資料源配置 SpringBoot從入門到精通(二十二)使用Swagger2優雅建構 RESTful API文檔 SpringBoot從入門到精通(二十一)如何優雅的設計 RESTful API 接口版本号,實作 API 版本控制! SpringBoot從入門到精通(二十)快速建構RESTful Web API 服務 SpringBoot從入門到精通(十九)使用注解實作動态Sql、參數傳遞 SpringBoot從入門到精通(十八)Mybatis系列之——使用注解的方式實作背景管理功能 SpringBoot從入門到精通(十七)MyBatis系列之——建立自定義mapper 實作多表關聯查詢! SpringBoot從小白到精通(十六)使用pagehelper實作分頁查詢功能 SpringBoot從小白到精通(十五)實作開發環境熱部署 SpringBoot從小白到精通(十四)使用JdbcTemplate操作資料庫,配置多資料源! SpringBoot從小白到精通(十三)如何實作事務儲存 SpringBoot從小白到精通(十二)logback日志配置 SpringBoot從小白到精通(十一)統一異常處理 SpringBoot從小白到精通(十)使用Interceptor攔截器,一學就會! SpringBoot從小白到精通(九)使用@Async實作異步執行任務 SpringBoot從小白到精通(八)熟悉@EnableScheduling,一秒搞定定時任務 SpringBoot從小白到精通(七)使用Redis實作高速緩存架構 SpringBoot從小白到精通(六)使用Mybatis實作增删改查【附詳細步驟】 SpringBoot從小白到精通(五)Thymeleaf的文法及常用标簽 SpringBoot從小白到精通(四)Thymeleaf頁面模闆引擎 SpringBoot從小白到精通(三)系統配置及自定義配置 SpringBoot從小白到精通(二)如何傳回統一的資料格式 SpringBoot從小白到精通(一)如何快速建立SpringBoot項目