SpringBoot整合JPA並簡單使用示例

乾了這碗毒雞湯~


相關知識說明

       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也一樣能完成。

 

^_^ 如有不當之處,歡迎指正

^_^ 測試代碼託管鏈接 
               
https://github.com/JustryDeng/CommonRepository

^_^ 本文已經被收錄進《程序員成長筆記(五)》,筆者JustryDeng

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章