之前介紹了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方面的技術:
- 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:指定數據庫的存儲引擎為 InnoDB
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 也一樣可以滿足你的需求。