1. 程式人生 > >SpringBoot系列教程JPA之基礎環境搭建

SpringBoot系列教程JPA之基礎環境搭建

JPA(Java Persistence API)Java持久化API,是 Java 持久化的標準規範,Hibernate是持久化規範的技術實現,而Spring Data JPA是在 Hibernate 基礎上封裝的一款框架。JPA作為標準,實際上並沒有說侷限於某個固定的資料來源,事實上mysql,mongo, solr都是ok的。接下來我們將介紹下springboot結合jpa 來實現mysql的curd以及更加複雜一點的sql支援

<!-- more -->

jpa系列教程將包含以下幾塊

  • 環境搭建
  • 基礎的插入、修改、刪除資料的使用姿勢
  • 基礎的單表查詢,如(>, <, = , in, like, between),分頁,排序等
  • 多表關聯查詢
  • 事物使用

本篇為開始第一篇,先搭建一個可以愉快玩耍的jpa專案

I. 環境搭建

我們選擇的資料庫為mysql,所以有必要先安裝一下,這裡跳過mysql的安裝教程,直接進入springboot專案的搭建

1. pom依賴

我們這裡選擇的是2.0.4.RELEASE版本進行演示

 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from update -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.45</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

上面的pom依賴中,關鍵的是下面兩個, 第一個引入的是jpa相關包,後面那個則是mysql的連線依賴,相當於指定操作mysql資料庫

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

2. 資料準備

建立一個測試表進行後續的讀寫操作,為了後續的事物講解方便,我們建立一個表,裡面存了每個人的錢

CREATE TABLE `money` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL DEFAULT '' COMMENT '使用者名稱',
  `money` int(26) NOT NULL DEFAULT '0' COMMENT '錢',
  `is_deleted` tinyint(1) NOT NULL DEFAULT '0',
  `create_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
  `update_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`id`),
  KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

在表中隨意插入幾條資料,以方便後面使用

INSERT INTO `money` (`id`, `name`, `money`, `is_deleted`, `create_at`, `update_at`)
VALUES
	(1, '一灰灰blog', 100, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40'),
	(2, '一灰灰2', 200, 0, '2019-04-18 17:01:40', '2019-04-18 17:01:40');

dbdata

3. 屬性配置

建立springboot工程之後,新增mysql的相關配置,在resources目錄下,新建檔案 application.properties

## DataSource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/story?useUnicode=true&characterEncoding=UTF-8&useSSL=false
#spring.datasource.driver-class-name= com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=

config

4. 專案構建並測試

根據JPA的一般使用姿勢,我們需要針對上面的表,建立一個對應的POJO物件,將它們關聯起來,程式碼如下:

  • 注意下幾個註解 @Entity, @Table, @Column, @Id, @GeneratedValue
  • 注意下POJO中欄位的型別,這裡保證了和db的欄位定義型別一致
  • (關於上面兩點的更多知識點,後面的文章會給出更詳細用法說明,歡迎持續跟進)
package com.git.hui.boot.jpa.entity;

import lombok.Data;

import javax.persistence.*;
import java.sql.Date;

/**
 * Created by @author yihui in 21:01 19/6/10.
 */
@Data
@Entity
@Table(name = "money")
public class MoneyPO {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "money")
    private Long money;

    @Column(name = "is_deleted")
    private Byte isDeleted;

    @Column(name = "create_at")
    private Date createAt;

    @Column(name = "update_at")
    private Date updateAt;
}

表結構定義完畢之後,接下來就是定義db的操作api,jpa的使用,通過方法名來解析出對應的sql,我們這裡定義一個簡單的Money表的操作API:

  • MoneyDemoRepository 繼承自 JpaRepository
  • 兩個泛型引數,第一個表示這個repository操作的表繫結的POJO,第二個表示自增id型別
package com.git.hui.boot.jpa.repository;

import com.git.hui.boot.jpa.entity.MoneyPO;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

/**
 * Created by @author yihui in 21:01 19/6/10.
 */
public interface MoneyDemoRepository extends JpaRepository<MoneyPO, Integer> {
}

上面兩個定義完畢之後,不需要其他的操作,就可以進行測試環境了,上面這個Repository提供了一些簡單的操作

package com.git.hui.boot.jpa;

import com.git.hui.boot.jpa.demo.JpaQueryDemo;
import com.git.hui.boot.jpa.entity.MoneyPO;
import com.git.hui.boot.jpa.repository.MoneyDemoRepository;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Created by @author yihui in 20:58 19/6/10.
 */
@SpringBootApplication
public class Application {
    public Application(MoneyDemoRepository moneyDemoRepository) {
        MoneyPO moneyPO = moneyDemoRepository.findById(1).get();
        System.out.println(moneyPO);
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}

針對上面的測試case進行簡單的說明,前面定義了一個POJO物件和一個RepositoryAPI,我們想直接操作對應的表,需要藉助這個RepositoryAPI物件,但是它是介面型別,我們沒法直接使用的,因為我們是在Spring生態體系中,所以可以直接通過IoC注入方式使用

所以上面的測試中,MoneyDemoRepository 物件實際上是由框架生成的一個代理物件,下面我們看下執行結果

test

5. 小結

從上面的步驟下來,會發現搭建一個jpa的專案工程屬於比較簡單的過程,新增必要的依賴,稍微注意的是兩個

  • 建立一個POJO 與我們實際的表關聯起來
  • 建立一個RepositoryApi繼承自org.springframework.data.repository.CrudRepository
  • 通過IoC/DI方式注入RepositoryApi物件,然後可以愉快的進行db操作

II. 其他

0. 專案

1. 一灰灰Blog

盡信書則不如,以上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激

下面一灰灰的個人部落格,記錄所有學習和工作中的博文,歡迎大家前去逛逛