最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot集成JPA全指南

 更新時(shí)間:2025年08月17日 10:16:21   作者:柯南二號(hào)  
在Java Web開(kāi)發(fā)中,數(shù)據(jù)庫(kù)訪問(wèn)是繞不開(kāi)的話題,傳統(tǒng)方式使用JDBC編寫(xiě)SQL,維護(hù)困難、可讀性差,后來(lái)有了MyBatis這種半自動(dòng)ORM框架,再到JPA這種全自動(dòng)ORM規(guī)范,SpringBoot對(duì)JPA提供了非常友好的自動(dòng)化支持,本文給大家介紹了SpringBoot集成JPA全指南

一、前言

在 Java Web 開(kāi)發(fā)中,數(shù)據(jù)庫(kù)訪問(wèn)是繞不開(kāi)的話題。

傳統(tǒng)方式使用 JDBC 編寫(xiě) SQL,維護(hù)困難、可讀性差。后來(lái)有了 MyBatis 這種半自動(dòng) ORM 框架,再到 JPA(Java Persistence API)這種全自動(dòng) ORM 規(guī)范,可以讓我們用面向?qū)ο蟮姆绞讲僮鲾?shù)據(jù)庫(kù),而不必寫(xiě)大量 SQL。

Spring Boot 對(duì) JPA 提供了非常友好的自動(dòng)化支持,幾乎可以“零配置”就完成數(shù)據(jù)庫(kù)操作。

二、JPA 簡(jiǎn)介

JPA(Java Persistence API)并不是一個(gè)具體實(shí)現(xiàn),而是 Java 官方定義的 ORM 規(guī)范,它的常見(jiàn)實(shí)現(xiàn)有:

  • Hibernate(最常用,Spring Boot 默認(rèn) JPA 實(shí)現(xiàn))
  • EclipseLink
  • OpenJPA

核心思想

實(shí)體類(lèi)(Entity)映射數(shù)據(jù)庫(kù)表,用 方法調(diào)用 代替手寫(xiě) SQL。

例如:

// 查詢(xún)所有用戶(hù)
List<User> users = userRepository.findAll();

// 根據(jù)用戶(hù)名查詢(xún)
User user = userRepository.findByUsername("Tom");

三、項(xiàng)目環(huán)境準(zhǔn)備

1. 新建 Spring Boot 項(xiàng)目

在 Spring Initializr 選擇:

Spring Boot 版本:3.x(或 2.7.x)

依賴(lài):

  • Spring Web
  • Spring Data JPA
  • MySQL Driver

生成后導(dǎo)入 IDE(IntelliJ IDEA / VSCode)。

2. Maven 依賴(lài)

如果是手動(dòng)添加,pom.xml 配置如下:

<dependencies>
    <!-- Spring Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- MySQL 驅(qū)動(dòng) -->
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- 測(cè)試依賴(lài) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

3. 配置數(shù)據(jù)庫(kù)連接

application.yml 中配置:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/jpa_demo?useSSL=false&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

  jpa:
    hibernate:
      ddl-auto: update   # 自動(dòng)建表(create、update、validate、none)
    show-sql: true       # 控制臺(tái)打印 SQL
    properties:
      hibernate:
        format_sql: true # 格式化 SQL 輸出

ddl-auto 參數(shù)說(shuō)明:

  • create:每次啟動(dòng)刪除舊表,創(chuàng)建新表
  • update:如果表不存在則創(chuàng)建,如果有新字段則更新
  • validate:驗(yàn)證表結(jié)構(gòu)和實(shí)體類(lèi)是否匹配
  • none:不做任何處理

四、編寫(xiě) JPA 樣例

1. 創(chuàng)建實(shí)體類(lèi)

User.java

package com.example.jpademo.entity;

import jakarta.persistence.*;
import lombok.Data;

@Data
@Entity
@Table(name = "users") // 表名
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 自增主鍵
    private Long id;

    @Column(nullable = false, unique = true, length = 50)
    private String username;

    @Column(nullable = false)
    private String password;
}

2. 創(chuàng)建 Repository 接口

UserRepository.java

package com.example.jpademo.repository;

import com.example.jpademo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    // 按用戶(hù)名查找
    User findByUsername(String username);
}

JpaRepository 已經(jīng)內(nèi)置了大量方法:save()、findAll()findById()、deleteById() 等。

3. 創(chuàng)建 Service 層

UserService.java

package com.example.jpademo.service;

import com.example.jpademo.entity.User;
import com.example.jpademo.repository.UserRepository;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {

    private final UserRepository userRepository;
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    public User createUser(User user) {
        return userRepository.save(user);
    }
}

4. 創(chuàng)建 Controller

UserController.java

package com.example.jpademo.controller;

import com.example.jpademo.entity.User;
import com.example.jpademo.service.UserService;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {

    private final UserService userService;
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping
    public List<User> list() {
        return userService.getAllUsers();
    }

    @PostMapping
    public User add(@RequestBody User user) {
        return userService.createUser(user);
    }
}

五、運(yùn)行測(cè)試

啟動(dòng) Spring Boot 項(xiàng)目(IDEA Run

使用 Postman 測(cè)試:

新增用戶(hù)

POST http://localhost:8080/users
Content-Type: application/json

{
  "username": "Tom",
  "password": "123456"
}

查詢(xún)所有用戶(hù)

GET http://localhost:8080/users

控制臺(tái)會(huì)輸出類(lèi)似:

insert into users (password, username) values (?, ?)
select u1_0.id, u1_0.password, u1_0.username from users u1_0

六、常見(jiàn)問(wèn)題

為什么啟動(dòng)時(shí)會(huì)自動(dòng)建表?
因?yàn)?spring.jpa.hibernate.ddl-auto 設(shè)置了 update,Hibernate 會(huì)自動(dòng)根據(jù)實(shí)體生成表結(jié)構(gòu)。

不想自動(dòng)建表怎么辦?
ddl-auto 改成 nonevalidate,用手動(dòng) SQL 建表。

怎么寫(xiě)復(fù)雜 SQL?

  • 方法名查詢(xún):findByUsernameAndPassword
  • JPQL 查詢(xún):@Query("select u from User u where u.username = ?1")
  • 原生 SQL:@Query(value = "select * from users where username = ?1", nativeQuery = true)

七、總結(jié)

Spring Boot 集成 JPA 最大的優(yōu)點(diǎn)就是:

  • 幾乎零配置即可運(yùn)行
  • 面向?qū)ο蟛僮鲾?shù)據(jù)庫(kù),減少 SQL 編寫(xiě)
  • 內(nèi)置方法豐富,支持分頁(yè)、排序、條件查詢(xún)
  • 復(fù)雜 SQL 也可以靈活編寫(xiě)

但要注意:

  • 適合中小型業(yè)務(wù),超復(fù)雜 SQL 可能 MyBatis 更高效
  • ddl-auto 在生產(chǎn)環(huán)境建議設(shè)為 none,防止誤刪表
  • 盡量用事務(wù)(@Transactional)保證數(shù)據(jù)一致性

以上就是SpringBoot集成JPA全指南的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot集成JPA的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Maven重復(fù)依賴(lài)問(wèn)題解決(同一個(gè)jar多個(gè)版本)

    Maven重復(fù)依賴(lài)問(wèn)題解決(同一個(gè)jar多個(gè)版本)

    本文主要介紹了Maven重復(fù)依賴(lài)問(wèn)題解決(同一個(gè)jar多個(gè)版本),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • spring 如何解決循環(huán)依賴(lài)

    spring 如何解決循環(huán)依賴(lài)

    這篇文章主要介紹了spring 如何解決循環(huán)依賴(lài),幫助大家更好的理解和學(xué)習(xí)使用spring框架,感興趣的朋友可以了解下
    2021-02-02
  • 一文詳解Java Function的高級(jí)使用技巧

    一文詳解Java Function的高級(jí)使用技巧

    本文總結(jié)了10種企業(yè)級(jí)Java Function的編程技巧,包括柯里化、EnumMap+Supplier、ImmutableMap+BiConsumer等,通過(guò)函數(shù)式編程解決實(shí)際問(wèn)題,提高代碼復(fù)用性和可維護(hù)性,需要的朋友可以參考下
    2026-03-03
  • SpringBoot多數(shù)據(jù)源配置的全過(guò)程記錄

    SpringBoot多數(shù)據(jù)源配置的全過(guò)程記錄

    在用SpringBoot開(kāi)發(fā)項(xiàng)目時(shí),隨著業(yè)務(wù)量的擴(kuò)大,我們通常會(huì)進(jìn)行數(shù)據(jù)庫(kù)拆分或是引入其他數(shù)據(jù)庫(kù),從而我們需要配置多個(gè)數(shù)據(jù)源,下面這篇文章主要給大家介紹了關(guān)于SpringBoot多數(shù)據(jù)源配置的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • 使用Java操作Parquet文件的基本步驟

    使用Java操作Parquet文件的基本步驟

    Parquet 是一個(gè)強(qiáng)大的列式存儲(chǔ)格式,適用于大數(shù)據(jù)場(chǎng)景,能夠高效地進(jìn)行數(shù)據(jù)壓縮、查詢(xún)和存儲(chǔ),在 Java 中使用 Apache Spark 讀取和寫(xiě)入 Parquet 文件是一項(xiàng)常見(jiàn)的任務(wù),本文給大家介紹了在 Java 中使用 Spark 來(lái)讀取和寫(xiě)入 Parquet 文件的基本步驟,需要的朋友可以參考下
    2025-03-03
  • SpringBoot事務(wù)失效的七種場(chǎng)景分析及解決方案

    SpringBoot事務(wù)失效的七種場(chǎng)景分析及解決方案

    Spring Boot 中的事務(wù)失效通常是由于代理機(jī)制、異常處理、傳播行為配置不當(dāng)?shù)仍蛞鸬?通過(guò)合理配置和排查,可以有效避免事務(wù)失效問(wèn)題,所以本文給大家總結(jié)了SpringBoot事務(wù)失效的七種場(chǎng)景分析及解決方案,需要的朋友可以參考下
    2025-05-05
  • Eclipse插件大全 挑選最牛的TOP30(全)

    Eclipse插件大全 挑選最牛的TOP30(全)

    ?“Eclipse最牛的30個(gè)插件”不知道看官們是否了解,風(fēng)少俠特意翻譯出來(lái)奉獻(xiàn)給各位,希望大家喜歡
    2013-02-02
  • Java實(shí)現(xiàn)本地緩存的四種方案(Guava Cache、Caffeine、Ehcach 和Spring Cache)

    Java實(shí)現(xiàn)本地緩存的四種方案(Guava Cache、Caffeine、Ehcach 和Sprin

    在現(xiàn)代應(yīng)用程序開(kāi)發(fā)中,緩存是提高性能和響應(yīng)速度的關(guān)鍵技術(shù)之一,Java 提供了多種本地緩存解決方案,每種方案都有其特點(diǎn)和適用場(chǎng)景,本文將介紹四種常見(jiàn)的 Java 本地緩存實(shí)現(xiàn),需要的朋友可以參考下
    2024-12-12
  • 解決@Around對(duì)靜態(tài)方法不生效的問(wèn)題

    解決@Around對(duì)靜態(tài)方法不生效的問(wèn)題

    這篇文章主要介紹了解決@Around對(duì)靜態(tài)方法不生效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • 使用Java代碼獲取服務(wù)器性能信息及局域網(wǎng)內(nèi)主機(jī)名

    使用Java代碼獲取服務(wù)器性能信息及局域網(wǎng)內(nèi)主機(jī)名

    這篇文章主要介紹了使用Java代碼獲取服務(wù)器性能信息及局域網(wǎng)內(nèi)主機(jī)名的方法,方便對(duì)服務(wù)器的遠(yuǎn)程管理和團(tuán)隊(duì)協(xié)作時(shí)用到,而且文中的方法無(wú)需調(diào)用jni,需要的朋友可以參考下
    2015-11-11

最新評(píng)論

元朗区| 左贡县| 哈巴河县| 永嘉县| 德格县| 钟山县| 安塞县| 昭通市| 万宁市| 会泽县| 襄樊市| 政和县| 应用必备| 连州市| 泸定县| 齐河县| 慈利县| 崇文区| 绍兴市| 汕尾市| 阿巴嘎旗| 文山县| 泾源县| 汉中市| 正宁县| 营口市| 拜泉县| 吉林省| 陈巴尔虎旗| 晋中市| 太保市| 肃宁县| 江油市| 莱芜市| 无棣县| 莱西市| 张家口市| 志丹县| 睢宁县| 庆阳市| 沾化县|