」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 資料庫與 Spring Boot 整合:最佳實踐和工具

資料庫與 Spring Boot 整合:最佳實踐和工具

發佈於2024-07-30
瀏覽:383

Database Integration with Spring Boot : Best Practices and Tools

将数据库与 Spring Boot 应用程序集成是许多开发人员执行的常见任务。 Spring Boot 与 Spring Data JPA 相结合,提供了一个强大的框架来使用 MySQL 等关系数据库。此外,Flyway 和 Liquibase 等工具有助于高效管理数据库迁移。本博客将介绍使用 Spring Data JPA 与关系数据库、与 MySQL 集成以及使用 Flyway 或 Liquibase 管理数据库迁移的最佳实践

将 Spring Data JPA 与关系数据库结合使用
Spring Data JPA 通过减少样板代码量来简化数据访问层的实现。它为各种数据存储提供了强大的存储库抽象,使数据库交互更加简单

使用 Spring Data JPA 的最佳实践:

与 MySQL 等 SQL 数据库集成:
MySQL 是最流行的关系数据库之一,将其与 Spring Boot 集成非常简单。

将 MySQL 与 Spring Boot 集成的步骤:
添加依赖项: 在 pom.xml 中添加 Spring Data JPA 和 MySQL 连接器所需的依赖项


    org.springframework.boot
    spring-boot-starter-data-jpa


    mysql
    mysql-connector-java


数据库配置: 在 application.properties 或 application.yml 中配置数据库连接详细信息

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydatabase
    username: root
    password: rootpassword
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

定义您的实体: 首先定义您的 JPA 实体 每个实体代表数据库中的一个表

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;

    @Column(unique = true, nullable = false)
    private String email;

    // Getters and Setters
}

创建存储库:创建存储库接口来执行CRUD操作。扩展 JpaRepository 以利用内置方法和自定义查询方法

public interface UserRepository extends JpaRepository {
    Optional findByEmail(String email);
}

创建服务层:使用服务层封装业务逻辑并与存储库交互

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    // Create operation
    public User createUser(User user) {
        // Perform validation or business logic if needed
        return userRepository.save(user);
    }

    // Read operations

    public Optional findUserById(Long id) {
        return userRepository.findById(id);
    }

    public Optional findUserByEmail(String email) {
        return userRepository.findByEmail(email);
    }

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

    // Update operation
    public User updateUser(Long id, User userDetails) {
        // Ensure the user exists
        User existingUser = userRepository.findById(id)
                .orElseThrow(() -> new ResourceNotFoundException("User not found with id: "   id));

        // Update user details
        existingUser.setName(userDetails.getName());
        existingUser.setEmail(userDetails.getEmail());

        // Save updated user
        return userRepository.save(existingUser);
    }

    // Delete operation
    public void deleteUser(Long id) {
        // Ensure the user exists
        User existingUser = userRepository.findById(id)
                .orElseThrow(() -> new ResourceNotFoundException("User not found with id: "   id));

        // Delete user
        userRepository.delete(existingUser);
    }
}

异常处理 :
在 updateUser 和 deleteUser 方法中,您可能需要处理具有指定 ID 的用户不存在的情况。您可以创建自定义异常(例如 ResourceNotFoundException)并在必要时抛出它

@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
    public ResourceNotFoundException(String message) {
        super(message);
    }
}

运行MySQL服务器:确保MySQL服务器正在运行,并且指定的数据库(mydatabase)存在。您可以使用 MySQL CLI 或 GUI 工具(例如 MySQL Workbench

)创建数据库

测试连接:运行 Spring Boot 应用程序以验证与 MySQL 数据库的连接。如果配置正确,Spring Boot 将根据您的实体自动创建必要的表

使用 Flyway 或 Liquibase 进行数据库迁移:
管理数据库模式更改对于维护应用程序的完整性和一致性至关重要。 Flyway 和 Liquibase 是处理数据库迁移的两种流行工具。

使用 Flyway 进行数据库迁移
Flyway是一个使用SQL脚本来管理数据库版本控制的迁移工具

添加依赖项: 将 Flyway 依赖项添加到您的 pom.xml


    org.flywaydb
    flyway-core


配置Flyway : 在application.properties或application.yml中配置Flyway

spring:
  flyway:
    enabled: true
    locations: classpath:db/migration

创建迁移脚本: 将 SQL 迁移脚本放置在 src/main/resources/db/migration 目录中。按照 Flyway 的命名约定命名脚本(V1_Initial_Setup.sql、V2_Add_User_Table.sql 等)

-- V1__Initial_Setup.sql
CREATE TABLE user (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE
);

运行迁移: Flyway 将在应用程序启动时自动运行迁移

使用 Liquibase 进行数据库迁移:
Liquibase 是另一个用于管理数据库迁移的强大工具,支持 XML、YAML、JSON 和 SQL 格式。

添加依赖项: 将 Liquibase 依赖项添加到 pom.xml


    org.liquibase
    liquibase-core


配置 Liquibase : 在 application.properties 或 application.yml 中配置 Liquibase

spring:
  liquibase:
    enabled: true
    change-log: classpath:db/changelog/db.changelog-master.yaml

创建 ChangeLog 文件: 在 src/main/resources/db/changelog 中定义数据库更改。创建一个包含其他变更日志文件的主变更日志文件 (db.changelog-master.yaml)

databaseChangeLog:
  - changeSet:
      id: 1
      author: yourname
      changes:
        - createTable:
            tableName: user
            columns:
              - column:
                  name: id
                  type: BIGINT
                  autoIncrement: true
                  constraints:
                    primaryKey: true
              - column:
                  name: name
                  type: VARCHAR(100)
                  constraints:
                    nullable: false
              - column:
                  name: email
                  type: VARCHAR(100)
                  constraints:
                    nullable: false
                    unique: true

运行迁移: Liquibase 将在应用程序启动时自动运行迁移

结论
得益于 Spring Data JPA,数据库与 Spring Boot 的集成是无缝的,而 Flyway 和 Liquibase 等工具使管理数据库迁移变得简单。通过遵循本博客中概述的最佳实践,您可以确保您的 Spring Boot 应用程序与 MySQL 等关系数据库高效交互,并且您的数据库模式随着应用程序的增长而顺利发展

版本聲明 本文轉載於:https://dev.to/abhishek999/database-integration-with-spring-boot-best-practices-and-tools-5doh?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    在Microsoft Visual C 中,Microsoft consions用戶strate strate strate strate strate strate strate strate strate strate strate strate strate strate strate st...
    程式設計 發佈於2025-05-05
  • 查找當前執行JavaScript的腳本元素方法
    查找當前執行JavaScript的腳本元素方法
    如何引用當前執行腳本的腳本元素在某些方案中理解問題在某些方案中,開發人員可能需要將其他腳本動態加載其他腳本。但是,如果Head Element尚未完全渲染,則使用document.getElementsbytagname('head')[0] .appendChild(v)的常規方...
    程式設計 發佈於2025-05-05
  • 為什麼我的CSS背景圖像出現?
    為什麼我的CSS背景圖像出現?
    故障排除:CSS背景圖像未出現 ,您的背景圖像儘管遵循教程說明,但您的背景圖像仍未加載。圖像和样式表位於相同的目錄中,但背景仍然是空白的白色帆布。 而不是不棄用的,您已經使用了CSS樣式: bockent {背景:封閉圖像文件名:背景圖:url(nickcage.jpg); 如果您的html,cs...
    程式設計 發佈於2025-05-05
  • Python讀取CSV文件UnicodeDecodeError終極解決方法
    Python讀取CSV文件UnicodeDecodeError終極解決方法
    在試圖使用已內置的CSV模塊讀取Python中時,CSV文件中的Unicode Decode Decode Decode Decode decode Error讀取,您可能會遇到錯誤的錯誤:無法解碼字節 在位置2-3中:截斷\ uxxxxxxxx逃脫當CSV文件包含特殊字符或Unicode的路徑逃...
    程式設計 發佈於2025-05-05
  • 將圖片浮動到底部右側並環繞文字的技巧
    將圖片浮動到底部右側並環繞文字的技巧
    在Web設計中圍繞在Web設計中,有時可以將圖像浮動到頁面右下角,從而使文本圍繞它纏繞。這可以在有效地展示圖像的同時創建一個吸引人的視覺效果。 css位置在右下角,使用css float and clear properties: img { 浮點:對; ...
    程式設計 發佈於2025-05-05
  • 如何限制動態大小的父元素中元素的滾動範圍?
    如何限制動態大小的父元素中元素的滾動範圍?
    在交互式接口中實現垂直滾動元素的CSS高度限制,控制元素的滾動行為對於確保用戶體驗和可訪問性是必不可少的。一種這樣的方案涉及限制動態大小的父元素中元素的滾動範圍。 問題:考慮一個佈局,其中我們具有與用戶垂直滾動一起移動的可滾動地圖div,同時與固定的固定sidebar保持一致。但是,地圖的滾動無限...
    程式設計 發佈於2025-05-05
  • 如何在鼠標單擊時編程選擇DIV中的所有文本?
    如何在鼠標單擊時編程選擇DIV中的所有文本?
    在鼠標上選擇div文本單擊帶有文本內容,用戶如何使用單個鼠標單擊單擊div中的整個文本?這允許用戶輕鬆拖放所選的文本或直接複製它。 在單個鼠標上單擊的div元素中選擇文本,您可以使用以下Javascript函數: function selecttext(canduterid){ if(d...
    程式設計 發佈於2025-05-05
  • 如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    程式設計 發佈於2025-05-05
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在Java中的多個返回類型:一種誤解類型:在Java編程中揭示,在Java編程中,Peculiar方法簽名可能會出現,可能會出現,使開發人員陷入困境,使開發人員陷入困境。 getResult(string s); ,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但這確實是如此嗎...
    程式設計 發佈於2025-05-05
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript [#1089-不正確的前綴鍵在嘗試在表中創建一個prefix鍵時會出現。前綴鍵旨在索引字符串列的特定前綴長度長度,以便更快地搜索這些前綴。 理解prefix keys `這將在整個Movie_ID列上創建標準主鍵。主密鑰對於唯一識...
    程式設計 發佈於2025-05-05
  • PHP SimpleXML解析帶命名空間冒號的XML方法
    PHP SimpleXML解析帶命名空間冒號的XML方法
    在php 很少,請使用該限制很大,很少有很高。例如:這種技術可確保可以通過遍歷XML樹和使用兒童()方法()方法的XML樹和切換名稱空間來訪問名稱空間內的元素。
    程式設計 發佈於2025-05-05
  • Java的Map.Entry和SimpleEntry如何簡化鍵值對管理?
    Java的Map.Entry和SimpleEntry如何簡化鍵值對管理?
    A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
    程式設計 發佈於2025-05-05
  • 在GO中構造SQL查詢時,如何安全地加入文本和值?
    在GO中構造SQL查詢時,如何安全地加入文本和值?
    在go中構造文本sql查詢時,在go sql queries 中,在使用conting and contement和contement consem per時,尤其是在使用integer per當per當per時,per per per當per. [&​​&&&&&&&&&&&&&&&默元組方法在...
    程式設計 發佈於2025-05-05
  • 解決Spring Security 4.1及以上版本CORS問題指南
    解決Spring Security 4.1及以上版本CORS問題指南
    彈簧安全性cors filter:故障排除常見問題 在將Spring Security集成到現有項目中時,您可能會遇到與CORS相關的錯誤,如果像“訪問Control-allo-allow-Origin”之類的標頭,則無法設置在響應中。為了解決此問題,您可以實現自定義過濾器,例如代碼段中的MyFi...
    程式設計 發佈於2025-05-05
  • 同實例無需轉儲複製MySQL數據庫方法
    同實例無需轉儲複製MySQL數據庫方法
    在同一實例上複製一個MySQL數據庫而無需轉儲在同一mySQL實例上複製數據庫,而無需創建InterMediate sqql script。以下方法為傳統的轉儲和IMPORT過程提供了更簡單的替代方法。 直接管道數據 MySQL手動概述了一種允許將mysqldump直接輸出到MySQL cli...
    程式設計 發佈於2025-05-05

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3