欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot整合JPA方法及配置解析

 更新時(shí)間:2023年05月12日 09:45:52   作者:Meta39  
這篇文章主要介紹了SpringBoot整合JPA方法及配置過程,JPA是Java Persistence API的簡稱,中文名Java持久層API,感興趣想要詳細(xì)了解可以參考下文

JPA與Hibernate及Spring Data JPA的關(guān)系

JPA是Java Persistence API的簡稱,中文名Java持久層API,是JDK 5.0注解或XML描述對象-關(guān)系表的映射關(guān)系,并將運(yùn)行期的實(shí)體對象持久化到數(shù)據(jù)庫中。Sun引入新的JPA ORM規(guī)范出于兩個(gè)原因:其一,簡化現(xiàn)有Java EE和Java SE應(yīng)用開發(fā)工作;其二,Sun希望整合ORM技術(shù),實(shí)現(xiàn)天下歸一。

Hibernate是一個(gè)開放源代碼的對象關(guān)系映射框架,它對JDBC進(jìn)行了非常輕量級(jí)的對象封裝,它將POJO與數(shù)據(jù)庫表建立映射關(guān)系,是一個(gè)全自動(dòng)的orm框架,hibernate可以自動(dòng)生成SQL語句,自動(dòng)執(zhí)行,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數(shù)據(jù)庫。 Hibernate可以應(yīng)用在任何使用JDBC的場合,既可以在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ǔ)庫變得容易。 本模塊處理對基于 JPA 的數(shù)據(jù)訪問層的增強(qiáng)支持。 它使構(gòu)建使用數(shù)據(jù)訪問技術(shù)的 Spring 驅(qū)動(dòng)的應(yīng)用程序變得更加容易。在相當(dāng)長的一段時(shí)間內(nèi),實(shí)現(xiàn)應(yīng)用程序的數(shù)據(jù)訪問層一直很麻煩。 必須編寫太多樣板代碼來執(zhí)行簡單的查詢以及執(zhí)行分頁和審核。 Spring Data JPA旨在通過將工作量減少到實(shí)際需要的數(shù)量來顯著改進(jìn)數(shù)據(jù)訪問層的實(shí)現(xiàn)。 作為開發(fā)人員,您編寫存儲(chǔ)庫接口,包括自定義查找器方法,Spring 將自動(dòng)提供實(shí)現(xiàn)。底層是Hibernate。

簡單理解就是JPA是java自帶的持久層API,然后Hibernate對JPA進(jìn)行了二次開發(fā)和優(yōu)化,Spring Data JPA又對Hibernate進(jìn)行了二次開發(fā)和優(yōu)化。

整合JPA

pom.xml

<dependencies>
        <!-- lombok插件依賴 -->
        <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:啟動(dòng)時(shí)刪除上一次生成的表,并根據(jù)實(shí)體類生成表,表中數(shù)據(jù)會(huì)被清空
  • create-drop:啟動(dòng)時(shí)根據(jù)實(shí)體類生成表,程序關(guān)閉時(shí)表會(huì)被刪除
  • update:啟動(dòng)時(shí)會(huì)根據(jù)實(shí)體類生成表,當(dāng)實(shí)體類屬性變動(dòng)的時(shí)候,表結(jié)構(gòu)也會(huì)更新,在初期開發(fā)階段使用此選項(xiàng)
  • validate:啟動(dòng)時(shí)驗(yàn)證實(shí)體類和數(shù)據(jù)表是否一致,在數(shù)據(jù)結(jié)構(gòu)穩(wěn)定時(shí)采用此選項(xiàng)
  • none:不采取任何措施

Person實(shí)體類

import lombok.Data;
import org.hibernate.annotations.Comment;
//import org.hibernate.annotations.Table;
import javax.persistence.*;
/**
 * 人員
 */
@Data
@Entity
//@Table(appliesTo = "person",comment = "人員表")//appliesTo指表的名稱(必填),MySQL表名小寫,用Person會(huì)拋異常。
public class Person {
    @Id//主鍵標(biāo)識(shí)
    @GeneratedValue(strategy = GenerationType.IDENTITY)//數(shù)據(jù)庫主鍵策略,默認(rèn)是AUTO。IDENTITY自增有符號(hào)主鍵
    @Comment("主鍵ID")//字段備注
    private Long id;
    @Column(name = "name",length = 20,unique = true,nullable = false)//字段屬性設(shè)置
    @Comment("名稱")
    private String name;
    @Comment("性別")
    private Integer sex;
    @Transient//此注解表示數(shù)據(jù)庫不創(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;
/**
 * 寫法參考<a  rel="external nofollow" />
 */
@Repository //不加也可以,只要你使用的時(shí)候注入即可。JpaRepository里面有很多簡單的CRUD接口,可以少寫很多代碼。
public interface PersonRepository extends JpaRepository<Person, Long> {
	//根據(jù)名稱精確查詢
    List<Person> findByName(String name);//自定義方法
	//模糊查詢
    List<Person> findByNameLike(String name);
	//分頁模糊查詢
    Page<Person> findAllByNameLike(String name, PageRequest pageRequest);
}

具體寫法以及寫法所對應(yīng)的SQL如下

在這里插入圖片描述

Test測試類

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ù)名稱查詢方法
//        log.info("{}",this.personRepository.findByNameLike("%t%"));//使用自定義模糊查詢方法
//        Page<Person> personPage = this.personRepository.findAll(PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "id")));//分頁查詢
//        log.info("{}", personPage);//自帶無參分頁查詢
        Page<Person> personPageByNameLike = this.personRepository.findAllByNameLike("%e%", PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "id")));
        personPageByNameLike.forEach(System.out::println);//自定義模糊分頁查詢(%M%這種寫法是不會(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來說,整體還是非常不錯(cuò)的??梢哉f簡單的單表幾乎不用寫SQL。復(fù)雜的業(yè)務(wù)建議用SQL去實(shí)現(xiàn),JPA的復(fù)雜查詢太啰嗦

到此這篇關(guān)于SpringBoot整合Java Persistence API方法及配置解析的文章就介紹到這了,更多相關(guān)SpringBoot整合JPA內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中的FileInputStream三種read()函數(shù)用法

    java中的FileInputStream三種read()函數(shù)用法

    這篇文章主要介紹了java中的FileInputStream三種read()函數(shù)用法,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • JAVA十大排序算法之插入排序詳解

    JAVA十大排序算法之插入排序詳解

    這篇文章主要介紹了java中的插入排序,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Intellij IDEA菜單欄不見了(Main Menu as Separate Toolbar)恢復(fù)菜單欄顯示的解決辦法

    Intellij IDEA菜單欄不見了(Main Menu as Separat

    有人問博主,關(guān)于Intellij IDEA菜單欄找不到了,被不小心的操作給隱藏了,怎么辦?下面給大家分享解決方案,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • SpringBoot下載文件的正確解法方式

    SpringBoot下載文件的正確解法方式

    這篇文章主要給大家介紹了關(guān)于SpringBoot下載文件的正確解法方式,SpringBoot是一款流行的框架,用于開發(fā)Web應(yīng)用程序,在使用SpringBoot構(gòu)建Web應(yīng)用程序時(shí),可能需要實(shí)現(xiàn)文件下載的功能,需要的朋友可以參考下
    2023-08-08
  • SpringMVC事件監(jiān)聽ApplicationListener實(shí)例解析

    SpringMVC事件監(jiān)聽ApplicationListener實(shí)例解析

    這篇文章主要介紹了SpringMVC事件監(jiān)聽ApplicationListener實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • java中幾種http請求方式示例詳解

    java中幾種http請求方式示例詳解

    在日常工作和學(xué)習(xí)中有很多地方都需要發(fā)送HTTP請求,下面這篇文章主要給大家介紹了關(guān)于java中幾種http請求方式的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • 實(shí)例解析Java單例模式編程中對抽象工廠模式的運(yùn)用

    實(shí)例解析Java單例模式編程中對抽象工廠模式的運(yùn)用

    這篇文章主要介紹了實(shí)例解析Java單例模式編程中對抽象工廠模式的運(yùn)用,抽象工廠模式可以看作是工廠方法模式的升級(jí)版,本需要的朋友可以參考下
    2016-02-02
  • 基于swagger測試List類型參數(shù)過程詳解

    基于swagger測試List類型參數(shù)過程詳解

    這篇文章主要介紹了基于swagger測試List類型參數(shù)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java的接口和抽象類深入理解

    Java的接口和抽象類深入理解

    這篇文章主要介紹了Java的接口和抽象類深入理解的相關(guān)資料,希望通過本文大家能夠理解應(yīng)用接口與抽象類的使用方法,需要的朋友可以參考下
    2017-09-09
  • Java讀取傳輸FTP文件實(shí)現(xiàn)示例

    Java讀取傳輸FTP文件實(shí)現(xiàn)示例

    本文主要介紹了Java讀取傳輸FTP文件方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評論