”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 数据库与 Spring Boot 集成:最佳实践和工具

数据库与 Spring Boot 集成:最佳实践和工具

发布于2024-07-30
浏览:243

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]删除
最新教程 更多>
  • 为什么使用固定定位时,为什么具有100%网格板柱的网格超越身体?
    为什么使用固定定位时,为什么具有100%网格板柱的网格超越身体?
    网格超过身体,用100%grid-template-columns 为什么在grid-template-colms中具有100%的显示器,当位置设置为设置的位置时,grid-template-colly修复了?问题: 考虑以下CSS和html: class =“ snippet-code”> g...
    编程 发布于2025-03-12
  • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
    为什么我会收到MySQL错误#1089:错误的前缀密钥?
    mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,可以更快地搜索这些前缀。了解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
    编程 发布于2025-03-12
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中可能会遇到一个冲突,其中3派对软件包将另一个带有导入套件的path package the Imptioned package the Imptioned package the Imported tocted pac...
    编程 发布于2025-03-12
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-03-12
  • Python读取CSV文件UnicodeDecodeError终极解决方法
    Python读取CSV文件UnicodeDecodeError终极解决方法
    在试图使用已内置的CSV模块读取Python中时,CSV文件中的Unicode Decode Decode Decode Decode decode Error读取,您可能会遇到错误的错误:无法解码字节 在位置2-3中:截断\ uxxxxxxxx逃脱当CSV文件包含特殊字符或Unicode的路径逃...
    编程 发布于2025-03-12
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-03-12
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-03-12
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-03-12
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-03-12
  • 如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    从python import codecs import codecs import codecs 导入 text = codecs.decode('这狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#带有...
    编程 发布于2025-03-12
  • 如何使用Regex在PHP中有效地提取括号内的文本
    如何使用Regex在PHP中有效地提取括号内的文本
    php:在括号内提取文本在处理括号内的文本时,找到最有效的解决方案是必不可少的。一种方法是利用PHP的字符串操作函数,如下所示: 作为替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式来搜索特...
    编程 发布于2025-03-12
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-03-12
  • 为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    The Mystery of "Broken" Two-Phase Template Instantiation in Microsoft Visual C Problem Statement:Users commonly express concerns that Micro...
    编程 发布于2025-03-12
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-03-12
  • PHP阵列键值异常:了解07和08的好奇情况
    PHP阵列键值异常:了解07和08的好奇情况
    PHP数组键值问题,使用07&08 在给定数月的数组中,键值07和08呈现令人困惑的行为时,就会出现一个不寻常的问题。运行print_r($月份)返回意外结果:键“ 07”丢失,而键“ 08”分配给了9月的值。此问题源于PHP对领先零的解释。当一个数字带有0(例如07或08)的前缀时,PHP将...
    编程 发布于2025-03-12

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3