SpringBoot整合JPA方法及配置解析
JPA與Hibernate及Spring Data JPA的關(guān)系
JPA是Java Persistence API的簡(jiǎn)稱(chēng),中文名Java持久層API,是JDK 5.0注解或XML描述對(duì)象-關(guān)系表的映射關(guān)系,并將運(yùn)行期的實(shí)體對(duì)象持久化到數(shù)據(jù)庫(kù)中。Sun引入新的JPA ORM規(guī)范出于兩個(gè)原因:其一,簡(jiǎn)化現(xiàn)有Java EE和Java SE應(yīng)用開(kāi)發(fā)工作;其二,Sun希望整合ORM技術(shù),實(shí)現(xiàn)天下歸一。
Hibernate是一個(gè)開(kāi)放源代碼的對(duì)象關(guān)系映射框架,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝,它將POJO與數(shù)據(jù)庫(kù)表建立映射關(guān)系,是一個(gè)全自動(dòng)的orm框架,hibernate可以自動(dòng)生成SQL語(yǔ)句,自動(dòng)執(zhí)行,使得Java程序員可以隨心所欲的使用對(duì)象編程思維來(lái)操縱數(shù)據(jù)庫(kù)。 Hibernate可以應(yīng)用在任何使用JDBC的場(chǎng)合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應(yīng)用中使用,最具革命意義的是,Hibernate可以在應(yīng)用EJB的JavaEE架構(gòu)中取代CMP,完成數(shù)據(jù)持久化的重任。
Spring Data JPA是更大的Spring Data家族的一部分,它使實(shí)現(xiàn)基于JPA的存儲(chǔ)庫(kù)變得容易。 本模塊處理對(duì)基于 JPA 的數(shù)據(jù)訪問(wèn)層的增強(qiáng)支持。 它使構(gòu)建使用數(shù)據(jù)訪問(wèn)技術(shù)的 Spring 驅(qū)動(dòng)的應(yīng)用程序變得更加容易。在相當(dāng)長(zhǎng)的一段時(shí)間內(nèi),實(shí)現(xiàn)應(yīng)用程序的數(shù)據(jù)訪問(wèn)層一直很麻煩。 必須編寫(xiě)太多樣板代碼來(lái)執(zhí)行簡(jiǎn)單的查詢以及執(zhí)行分頁(yè)和審核。 Spring Data JPA旨在通過(guò)將工作量減少到實(shí)際需要的數(shù)量來(lái)顯著改進(jìn)數(shù)據(jù)訪問(wèn)層的實(shí)現(xiàn)。 作為開(kāi)發(fā)人員,您編寫(xiě)存儲(chǔ)庫(kù)接口,包括自定義查找器方法,Spring 將自動(dòng)提供實(shí)現(xiàn)。底層是Hibernate。
簡(jiǎn)單理解就是JPA是java自帶的持久層API,然后Hibernate對(duì)JPA進(jìn)行了二次開(kāi)發(fā)和優(yōu)化,Spring Data JPA又對(duì)Hibernate進(jìn)行了二次開(kāi)發(fā)和優(yōu)化。
整合JPA
pom.xml
<dependencies>
<!-- lombok插件依賴(lài) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
<scope>runtime</scope>
</dependency>
<!-- jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/spring_boot_jpa_demo?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
jpa:
# 打印SQL
show-sql: true
hibernate:
# 5種建表策略,一般推薦update或none,首推update。
ddl-auto: update
- create:?jiǎn)?dòng)時(shí)刪除上一次生成的表,并根據(jù)實(shí)體類(lèi)生成表,表中數(shù)據(jù)會(huì)被清空
- create-drop:?jiǎn)?dòng)時(shí)根據(jù)實(shí)體類(lèi)生成表,程序關(guān)閉時(shí)表會(huì)被刪除
- update:?jiǎn)?dòng)時(shí)會(huì)根據(jù)實(shí)體類(lèi)生成表,當(dāng)實(shí)體類(lèi)屬性變動(dòng)的時(shí)候,表結(jié)構(gòu)也會(huì)更新,在初期開(kāi)發(fā)階段使用此選項(xiàng)
- validate:?jiǎn)?dòng)時(shí)驗(yàn)證實(shí)體類(lèi)和數(shù)據(jù)表是否一致,在數(shù)據(jù)結(jié)構(gòu)穩(wěn)定時(shí)采用此選項(xiàng)
- none:不采取任何措施
Person實(shí)體類(lèi)
import lombok.Data;
import org.hibernate.annotations.Comment;
//import org.hibernate.annotations.Table;
import javax.persistence.*;
/**
* 人員
*/
@Data
@Entity
//@Table(appliesTo = "person",comment = "人員表")//appliesTo指表的名稱(chēng)(必填),MySQL表名小寫(xiě),用Person會(huì)拋異常。
public class Person {
@Id//主鍵標(biāo)識(shí)
@GeneratedValue(strategy = GenerationType.IDENTITY)//數(shù)據(jù)庫(kù)主鍵策略,默認(rèn)是AUTO。IDENTITY自增有符號(hào)主鍵
@Comment("主鍵ID")//字段備注
private Long id;
@Column(name = "name",length = 20,unique = true,nullable = false)//字段屬性設(shè)置
@Comment("名稱(chēng)")
private String name;
@Comment("性別")
private Integer sex;
@Transient//此注解表示數(shù)據(jù)庫(kù)不創(chuàng)建該字段
private String ignore;//忽略字段
}PersonRepository接口
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* 寫(xiě)法參考<a rel="external nofollow" />
*/
@Repository //不加也可以,只要你使用的時(shí)候注入即可。JpaRepository里面有很多簡(jiǎn)單的CRUD接口,可以少寫(xiě)很多代碼。
public interface PersonRepository extends JpaRepository<Person, Long> {
//根據(jù)名稱(chēng)精確查詢
List<Person> findByName(String name);//自定義方法
//模糊查詢
List<Person> findByNameLike(String name);
//分頁(yè)模糊查詢
Page<Person> findAllByNameLike(String name, PageRequest pageRequest);
}具體寫(xiě)法以及寫(xiě)法所對(duì)應(yīng)的SQL如下

Test測(cè)試類(lèi)
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import javax.annotation.Resource;
@Slf4j
@SpringBootTest
public class PersonRepositoryTests {
@Resource
private PersonRepository personRepository;
/**
* 新增/修改。一般情況下新增是不傳ID的,只有修改才傳ID。
*/
@Test
public void save(){
Person person = new Person();
person.setName("Meta39");
person.setSex(0);
this.personRepository.save(person);
log.info("{}",this.personRepository.save(person));
}
/**
* 查詢
*/
@Test
public void search(){
// log.info("{}",this.personRepository.findById(1L));//使用框架自帶的方法
// log.info("{}",this.personRepository.findByName("Meta"));//使用自定義根據(jù)名稱(chēng)查詢方法
// log.info("{}",this.personRepository.findByNameLike("%t%"));//使用自定義模糊查詢方法
// Page<Person> personPage = this.personRepository.findAll(PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "id")));//分頁(yè)查詢
// log.info("{}", personPage);//自帶無(wú)參分頁(yè)查詢
Page<Person> personPageByNameLike = this.personRepository.findAllByNameLike("%e%", PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "id")));
personPageByNameLike.forEach(System.out::println);//自定義模糊分頁(yè)查詢(%M%這種寫(xiě)法是不會(huì)有SQL注入的,不信自己可以試試%M% and id = 1)
}
/**
* 刪除
*/
@Test
public void delete(){
this.personRepository.deleteById(1L);//根據(jù)ID刪除一條記錄
this.personRepository.deleteAllById(Arrays.asList(1L,2L,3L));//根據(jù)ID集合批量刪除記錄
}
}總結(jié)
JPA相比較MyBatis來(lái)說(shuō),整體還是非常不錯(cuò)的。可以說(shuō)簡(jiǎn)單的單表幾乎不用寫(xiě)SQL。復(fù)雜的業(yè)務(wù)建議用SQL去實(shí)現(xiàn),JPA的復(fù)雜查詢太啰嗦
到此這篇關(guān)于SpringBoot整合Java Persistence API方法及配置解析的文章就介紹到這了,更多相關(guān)SpringBoot整合JPA內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringbootJPA分頁(yè) PageRequest過(guò)時(shí)的替代方法
- Springboot JPA打印SQL語(yǔ)句及參數(shù)的實(shí)現(xiàn)
- SpringBoot整合JPA詳細(xì)代碼實(shí)例
- springboot Jpa多數(shù)據(jù)源(不同庫(kù))配置過(guò)程
- SpringBoot中的JPA(Java?Persistence?API)詳解
- 使用SpringBoot和JPA實(shí)現(xiàn)批量處理新增、修改
- SpringBoot集成Jpa對(duì)數(shù)據(jù)進(jìn)行排序、分頁(yè)、條件查詢和過(guò)濾操作
- SpringBoot整合JPA 基礎(chǔ)使用示例教程
相關(guān)文章
Spring使用注解更簡(jiǎn)單的讀取和存儲(chǔ)對(duì)象的方法
這篇文章主要介紹了Spring使用注解更簡(jiǎn)單的讀取和存儲(chǔ)對(duì)象的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-07-07
Java多線程編程之CountDownLatch同步工具使用實(shí)例
這篇文章主要介紹了Java多線程編程之CountDownLatch同步工具使用實(shí)例,需要的朋友可以參考下2015-05-05
Java并發(fā)工具類(lèi)Exchanger的相關(guān)知識(shí)總結(jié)
今天給大家?guī)?lái)的文章是Java工具類(lèi)Exchanger的相關(guān)知識(shí)總結(jié),文中有非常詳細(xì)的介紹及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下2021-06-06
Spring Security 中細(xì)化權(quán)限粒度的方法
這篇文章主要介紹了Spring Security 中細(xì)化權(quán)限粒度的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
使用jdk1.8實(shí)現(xiàn)將list根據(jù)指定的值去分組的操作
這篇文章主要介紹了使用jdk1.8實(shí)現(xiàn)將list根據(jù)指定的值去分組的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
java科學(xué)計(jì)數(shù)法轉(zhuǎn)換成數(shù)字的幾種方法
我們?cè)谔幚泶髷?shù)值的時(shí)候,常常會(huì)遇到使用科學(xué)計(jì)數(shù)法表示的數(shù)字,科學(xué)計(jì)數(shù)法是一種表示大數(shù)值或小數(shù)值的方式,下面這篇文章主要給大家介紹了關(guān)于java科學(xué)計(jì)數(shù)法轉(zhuǎn)換成數(shù)字的幾種方法,需要的朋友可以參考下2024-03-03

