JPA(Java Persistence API)Java持久化API,是 Java 持久化的標准規范,Hibernate是持久化規范的技術實現,而Spring Data JPA是在 Hibernate 基礎上封裝的一款框架。JPA作為標准,實際上並沒有說局限於某個固定的數據源,事實上mysql,mongo, solr都是ok的。接下來我們將介紹下springboot結合jpa 來實現mysql的curd以及更加復雜一點的sql支持
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');
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=
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
對象實際上是由框架生成的一個代理對象,下面我們看下執行結果
5. 小結
從上面的步驟下來,會發現搭建一個jpa的項目工程屬於比較簡單的過程,添加必要的依賴,稍微注意的是兩個
- 創建一個POJO 與我們實際的表關聯起來
- 創建一個
RepositoryApi
繼承自org.springframework.data.repository.CrudRepository
- 通過IoC/DI方式注入
RepositoryApi
對象,然后可以愉快的進行db操作
II. 其他
0. 項目
- 工程:https://github.com/liuyueyi/spring-boot-demo
- 項目: https://github.com/liuyueyi/spring-boot-demo/blob/master/spring-boot/102-jpa
1. 一灰灰Blog
盡信書則不如,以上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激
下面一灰灰的個人博客,記錄所有學習和工作中的博文,歡迎大家前去逛逛
- 一灰灰Blog個人博客 https://blog.hhui.top
- 一灰灰Blog-Spring專題博客 http://spring.hhui.top