乾了這碗毒雞湯~
相關知識說明:
JPA(Java Persistence API):JPA用於描述對象——關係表的映射關係,並將運行期的實體對象持久化到數據庫中。同時也提供有多達十八種增刪改查操作數據庫表的方法。JPA既可以JPA可以進行單表的增刪改查操作,也可以通過@OneToOne、@ManyToMany、@ManyToOne、@OneToMany註解實現聯表(多表)的查詢。
軟硬件環境說明:Windows10、IntelliJ IDEA、SpringBoot 2.1.4.RELEASE。
SpringBoot整合JPA:
第一步:在pom.xml中引入相關依賴
說明:本人使用的是MySQL,數據庫連接池用的是druid。除了引入上述依賴外,本人還引入了快速開
發lombok依賴,SpringBoot的基本test依賴。
給出完整版的pom.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.aspire</groupId>
<artifactId>jpa-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>jpa-demo</name>
<description>SpringBoot整合JPA並簡單使用示例</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- JPA支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.18</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
第二步:編寫系統配置文件
# --------------------------------------------------------------JPA(Java Persistence API)配置
# 將spring.jpa.hibernate.ddl-auto設置爲none,由此告知Hibernate不要創建數據表
# DDL模式(none、validate、update、create和create-drop)。
# 這是hibernate. hbm2ddl.auto屬性的一個快捷方式。在使用嵌入式數據庫時默認爲create-drop,其他情況下默認爲none
spring.jpa.hibernate.ddl-auto = none
#在使用Bitronix Transaction Manager時打開SQL語句日誌。(默認false)
spring.jpa.show-sql = true
#開啓JPA(默認true)
spring.data.jpa.repositories.enabled = true
# 要操作的目標數據庫類型,默認自動檢測。
# DEFAULT,DB2,DERBY,H2,HANA,HSQL,INFORMIX,MYSQL,ORACLE,POSTGRESQL,SQL_SERVER,SYBASE;
spring.jpa.database = MYSQL
# 要操作的目標數據庫,默認自動檢測。也可以通過spring.jpa.database枚舉指定。
spring.jpa.database-platform = org.hibernate.dialect.MySQL5Dialect
#啓動時要初始化Schema(默認false)
spring.jpa.generate-ddl = false
# 註冊OpenEntityManagerInViewInterceptor,在請求的整個處理過程中,
# 將一個JPAEntityManager綁定到線程上(默認true)
spring.jpa.open-in-view = true
# JPA提供方要設置的額外原生屬性
#spring.jpa.properties
# --------------------------------------------------------------MYSQL配置
# 高版本的MySQL需要指定時區serverTimezone=GMT%2B8
spring.datasource.url = jdbc:mysql://localhost:3306/demo?characterEncoding=utf8&serverTimezone=GMT%2B8
spring.datasource.username = root
spring.datasource.password = dengshuai
spring.datasource.type = com.alibaba.druid.pool.DruidDataSource
# 高版本的SpringBoot需要加上hikari
spring.datasource.hikari.driver-class-name = com.mysql.jdbc.Driver
第三步:根據表的結構,編寫對應的JPA實體類
本人的表是這樣的:
對應的JPA實體類時這樣的:
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.io.Serializable;
/**
* 員工實體類模型
*
*
* 這裏 @Data、@Builder、@NoArgsConstructor、@AllArgsConstructor 是: lombok的註解,與JPA無
* 關, 引入lombok主要是爲了快速開發
* 注: 若使用了@Builder註解、建議一定要使用 @NoArgsConstructor、@AllArgsConstructor註解,因
* 爲@Builder註解是建造者模式,如果只使用了@Builder,而不使用@NoArgsConstructor
* 、@AllArgsConstructor註解的話,可能他會導致fastjson、jpa等出現異常
*
* 這裏 @Entity 的作用是: 表明這是一個JPA實體
* 這裏 @Table 的作用是: 指明這個JPA實體 對應 那一張表
*
* @author JustryDeng
* @date 2019/4/22 20:41
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "employee")
public class EmployeePO implements Serializable {
/**
* 這裏 @Id 註解的作用是: 指明此字段對應的列是相關表的主鍵
* 這裏 @GeneratedValue 註解的作用是: 指定主鍵生成策略, 默認是AUTO的策略,也就是主鍵序列化,
* 由於mysql是不支持序列化的, 所以我們需要給他指定其他的策略,這裏
* GenerationType.IDENTITY表示 使用此數據庫服務器端自己的策略
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* 姓名
*
* 這裏@Column註解的作用是: 1、指明該字段對應表中的哪一列
* 2、指明此字段可以爲null(默認即爲true)
* 注:@Column註解還有很多屬性,如: 約束是否唯一、是否插入、是否更新、指定長度等等,
* 可詳見源碼 或 查閱相關資料文檔
*/
@Column(name = "name", nullable = true)
private String name;
/** 年齡 */
private Integer age;
/**
* 性別
*
* 這裏@Column註解的length屬性作用是: 指明該字段最大長度爲1
*/
@Column(length = 1)
private String gender;
/** 座右銘 */
private String motto;
}
注:其中@Data、@Builder、@NoArgsConstructor、@AllArgsConstructor是屬於lombok的註解,與JPA無關。
第四步:編寫數據操作層接口
import com.aspire.jpademo.model.EmployeePO;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* 直接繼承JpaRepository<T, ID>接口即可,其中T代表對應的實體,ID爲該表主鍵對應的字段的數據類型
*
* 注:JpaRepository中默認提供了十幾種 增、刪、改、查(T對應的)表的方法
*
* 注:JPA的實現框架會自動將此接口的實現注入到Spring上下文容器中, 我們使用時直接從Spring中獲取即可
*
* @author JustryDeng
* @date 2019/4/22 21:14
*/
public interface EmployeeMapper extends JpaRepository<EmployeePO, Long> {
}
注:直接繼承JpaRepository<T, ID>接口即可,其中T代表對應的實體,ID爲該表主鍵對應的字段的數據類型。
注:JpaRepository中默認提供了十幾種增、刪、改、查等操作的方法。
注:JPA的實現框架會自動將此接口的實現注入到Spring上下文容器中, 我們使用時直接從Spring中獲取即可。
使用示例:
聲明:以下示例是最基本最簡單的JPA使用示例,更多用法請自行查閱相關資料。
筆者寄語:
本文主要是演示SpringBoot如何整合並簡單使用JPA,對JPA的具體使用用法沒有深入學習(後面有機會的話,會進一步完善此文章)。JPA本身已經非常成熟了,其用法也十分豐富,甚至MyBatis等框架能完成的事,使用JPA也一樣能完成。