SpringBoot系列教程JPA之基礎(chǔ)環(huán)境搭建的方法
JPA(Java Persistence API)Java持久化API,是 Java 持久化的標(biāo)準(zhǔn)規(guī)范,Hibernate是持久化規(guī)范的技術(shù)實(shí)現(xiàn),而Spring Data JPA是在 Hibernate 基礎(chǔ)上封裝的一款框架。JPA作為標(biāo)準(zhǔn),實(shí)際上并沒(méi)有說(shuō)局限于某個(gè)固定的數(shù)據(jù)源,事實(shí)上mysql,mongo, solr都是ok的。接下來(lái)我們將介紹下springboot結(jié)合jpa 來(lái)實(shí)現(xiàn)mysql的curd以及更加復(fù)雜一點(diǎn)的sql支持
jpa系列教程將包含以下幾塊
- 環(huán)境搭建
- 基礎(chǔ)的插入、修改、刪除數(shù)據(jù)的使用姿勢(shì)
- 基礎(chǔ)的單表查詢(xún),如(>, <, = , in, like, between),分頁(yè),排序等
- 多表關(guān)聯(lián)查詢(xún)
- 事物使用
本篇為開(kāi)始第一篇,先搭建一個(gè)可以愉快玩耍的jpa項(xiàng)目
I. 環(huán)境搭建
我們選擇的數(shù)據(jù)庫(kù)為mysql,所以有必要先安裝一下,這里跳過(guò)mysql的安裝教程,直接進(jìn)入springboot項(xiàng)目的搭建
1. pom依賴(lài)
我們這里選擇的是2.0.4.RELEASE
版本進(jìn)行演示
<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依賴(lài)中,關(guān)鍵的是下面兩個(gè), 第一個(gè)引入的是jpa相關(guān)包,后面那個(gè)則是mysql的連接依賴(lài),相當(dāng)于指定操作mysql數(shù)據(jù)庫(kù)
<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. 數(shù)據(jù)準(zhǔn)備
創(chuàng)建一個(gè)測(cè)試表進(jìn)行后續(xù)的讀寫(xiě)操作,為了后續(xù)的事物講解方便,我們創(chuàng)建一個(gè)表,里面存了每個(gè)人的錢(qián)
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 '錢(qián)', `is_deleted` tinyint(1) NOT NULL DEFAULT '0', `create_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間', `update_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間', PRIMARY KEY (`id`), KEY `name` (`name`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
在表中隨意插入幾條數(shù)據(jù),以方便后面使用
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. 屬性配置
創(chuàng)建springboot工程之后,添加mysql的相關(guān)配置,在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. 項(xiàng)目構(gòu)建并測(cè)試
根據(jù)JPA的一般使用姿勢(shì),我們需要針對(duì)上面的表,創(chuàng)建一個(gè)對(duì)應(yīng)的POJO對(duì)象,將它們關(guān)聯(lián)起來(lái),代碼如下:
- 注意下幾個(gè)注解
@Entity
,@Table
,@Column
,@Id
,@GeneratedValue
- 注意下POJO中字段的類(lèi)型,這里保證了和db的字段定義類(lèi)型一致
- (關(guān)于上面兩點(diǎn)的更多知識(shí)點(diǎn),后面的文章會(huì)給出更詳細(xì)用法說(shuō)明,歡迎持續(xù)跟進(jìn))
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; }
表結(jié)構(gòu)定義完畢之后,接下來(lái)就是定義db的操作api,jpa的使用,通過(guò)方法名來(lái)解析出對(duì)應(yīng)的sql,我們這里定義一個(gè)簡(jiǎn)單的Money表的操作API:
MoneyDemoRepository
繼承自JpaRepository
- 兩個(gè)泛型參數(shù),第一個(gè)表示這個(gè)repository操作的表綁定的POJO,第二個(gè)表示自增id類(lèi)型
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> { }
上面兩個(gè)定義完畢之后,不需要其他的操作,就可以進(jìn)行測(cè)試環(huán)境了,上面這個(gè)Repository提供了一些簡(jiǎn)單的操作
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); } }
針對(duì)上面的測(cè)試case進(jìn)行簡(jiǎn)單的說(shuō)明,前面定義了一個(gè)POJO對(duì)象和一個(gè)RepositoryAPI
,我們想直接操作對(duì)應(yīng)的表,需要借助這個(gè)RepositoryAPI
對(duì)象,但是它是接口類(lèi)型,我們沒(méi)法直接使用的,因?yàn)槲覀兪窃赟pring生態(tài)體系中,所以可以直接通過(guò)IoC注入方式使用
所以上面的測(cè)試中,MoneyDemoRepository
對(duì)象實(shí)際上是由框架生成的一個(gè)代理對(duì)象,下面我們看下執(zhí)行結(jié)果
5. 小結(jié)
從上面的步驟下來(lái),會(huì)發(fā)現(xiàn)搭建一個(gè)jpa的項(xiàng)目工程屬于比較簡(jiǎn)單的過(guò)程,添加必要的依賴(lài),稍微注意的是兩個(gè)
- 創(chuàng)建一個(gè)POJO 與我們實(shí)際的表關(guān)聯(lián)起來(lái)
- 創(chuàng)建一個(gè)RepositoryApi繼承自org.springframework.data.repository.CrudRepository
- 通過(guò)IoC/DI方式注入RepositoryApi對(duì)象,然后可以愉快的進(jìn)行db操作
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java控制臺(tái)實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(集合版)
這篇文章主要為大家詳細(xì)介紹了java控制臺(tái)實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)的集合版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04Spring Junit測(cè)試找不到SpringJUnit4ClassRunner.class的解決
這篇文章主要介紹了Spring Junit測(cè)試找不到SpringJUnit4ClassRunner.class的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04如何在java 8 stream表達(dá)式實(shí)現(xiàn)if/else邏輯
這篇文章主要介紹了如何在java 8 stream表達(dá)式實(shí)現(xiàn)if/else邏輯,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04SpringBoot整合Redis使用RedisTemplate和StringRedisTemplate
Spring?Boot?Data(數(shù)據(jù))?Redis?中提供了RedisTemplate和StringRedisTemplate,其中StringRedisTemplate是RedisTemplate的子類(lèi),兩個(gè)方法基本一致。本文介紹了SpringBoot整合Redis使用RedisTemplate和StringRedisTemplate的方法,需要的可以參考一下2022-12-12MyEclipse打開(kāi)文件跳轉(zhuǎn)到notepad打開(kāi)問(wèn)題及解決方案
windows系統(tǒng)打開(kāi)README.md文件,每次都需要右鍵選擇notepad打開(kāi),感覺(jué)很麻煩,然后就把README.md文件打開(kāi)方式默認(rèn)選擇了notepad,這樣每次雙擊就能打開(kāi),感覺(jué)很方便,這篇文章主要介紹了MyEclipse打開(kāi)文件跳轉(zhuǎn)到notepad打開(kāi)問(wèn)題,需要的朋友可以參考下2024-03-03Java?SpringBoot集成文件之如何使用POI導(dǎo)出Word文檔
這篇文章主要介紹了Java?SpringBoot集成文件之如何使用POI導(dǎo)出Word文檔,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08Spring Boot中進(jìn)行 文件上傳和 文件下載功能實(shí)現(xiàn)
開(kāi)發(fā)Wb應(yīng)用時(shí),文件上傳是很常見(jiàn)的一個(gè)需求,瀏覽器 通過(guò) 表單形式 將 文件 以 流的形式傳遞 給 服務(wù)器,服務(wù)器再對(duì)上傳的數(shù)據(jù)解析處理,下面將通過(guò)一個(gè)案例講解使用 SpringBoot 實(shí)現(xiàn) 文件上傳,感興趣的朋友一起看看吧2024-07-07java 使用DecimalFormat進(jìn)行數(shù)字的格式化實(shí)例詳解
這篇文章主要介紹了java 使用DecimalFormat進(jìn)行數(shù)字的格式化實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06