当前位置: 首页 > news >正文

【Spring Boot 入门三】Spring Boot与数据库集成 - 构建数据驱动的应用

在这里插入图片描述

一、引言

在之前的文章中,我们已经对Spring Boot有了初步的认识,了解了如何构建第一个Spring Boot应用,以及如何通过配置文件来掌控应用的设置。这些知识为我们进一步探索Spring Boot与数据库的集成奠定了坚实的基础。

数据库是现代应用的核心组成部分,无论是企业级的信息管理系统、电子商务平台,还是移动应用的后端服务,都离不开数据库来存储和管理数据。Spring Boot作为一个流行的Java开发框架,提供了便捷的方式来集成各种数据库,使得开发者能够快速地构建数据驱动的应用。它简化了数据库连接、数据持久化、事务管理等复杂的操作,让开发者可以将更多的精力放在业务逻辑的实现上。

二、选择数据库和相关依赖

1. 常见数据库类型(MySQL、PostgreSQL、Oracle等)在Spring Boot中的应用

  • 比较不同数据库的特点和适用场景
    MySQL是一种开源的关系型数据库,具有广泛的应用。它以其易用性、高性能和可扩展性而受到开发者的喜爱,适用于各种规模的应用,特别是Web应用。MySQL的安装和配置相对简单,并且有丰富的文档和社区支持。

PostgreSQL是另一种强大的开源关系型数据库,它以其对复杂数据类型和高级查询功能的支持而闻名。PostgreSQL适合处理需要高度数据完整性和复杂查询的应用,如地理信息系统(GIS)、数据分析等领域。

Oracle是一款商业数据库,具有卓越的性能、可靠性和安全性。它在企业级应用中广泛使用,特别是对于大型企业和对数据安全要求极高的应用场景。然而,Oracle的使用成本相对较高,并且其管理和维护也较为复杂。

2. 在Spring Boot项目中添加数据库依赖

  • 使用Maven或Gradle添加依赖
    在Spring Boot项目中,如果使用Maven作为构建工具,以MySQL为例,需要在项目的pom.xml文件中添加以下依赖:
<dependency><groupId>mysql</groupId><artifactId>mysql - connector - java</artifactId>
</dependency>

如果使用Gradle作为构建工具,则需要在build.gradle文件中添加类似的依赖:

dependencies {implementation 'mysql:mysql - connector - java'
}

三、数据库连接配置

1. 在配置文件中配置数据库连接参数

  • 用户名、密码、数据库URL等的设置
    application.propertiesapplication.yml文件中配置MySQL数据库连接参数。例如,在application.properties文件中:
spring.datasource.url = jdbc:mysql://localhost:3306/mydb?useSSL = false&serverTimezone = UTC
spring.datasource.username = root
spring.datasource.password = password

application.yml文件中:

spring:datasource:url: jdbc:mysql://localhost:3306/mydb?useSSL = false&serverTimezone = UTCusername: rootpassword: password
  • 不同数据库连接参数的差异
    不同的数据库有不同的连接参数格式。例如,Oracle数据库的连接URL可能是jdbc:oracle:thin:@localhost:1521:orcl,并且其用户名和密码的设置方式可能与MySQL有所不同。

2. 使用数据源(DataSource)

  • 讲解Spring Boot默认的数据源配置
    Spring Boot默认使用HikariCP作为数据源,它是一个高性能的数据源实现。Spring Boot会根据在配置文件中设置的连接参数自动配置数据源。

  • 如何自定义数据源(如使用Druid数据源)
    要使用Druid数据源,首先需要添加Druid的依赖:

<dependency><groupId>com.alibaba</groupId><artifactId>druid - spring - boot - starter</artifactId><version>1.2.6</version>
</dependency>

然后在配置文件中进行Druid数据源的配置:

spring.datasource.druid.url = jdbc:mysql://localhost:3306/mydb?useSSL = false&serverTimezone = UTC
spring.datasource.druid.username = root
spring.datasource.druid.password = password
spring.datasource.druid.initial - size = 5
spring.datasource.druid.min - idle = 5
spring.datasource.druid.max - active = 20

四、使用JPA(Java Persistence API)进行数据持久化

1. 介绍JPA在Spring Boot中的应用

  • JPA的概念和优势
    JPA是Java EE中的一个规范,它定义了一种对象关系映射(ORM)的标准方式。在Spring Boot中使用JPA可以让开发者使用Java对象来操作数据库,而不需要编写大量的SQL语句。JPA的优势在于提高了开发效率、代码的可维护性和可移植性。

2. 创建实体类

  • 使用@Entity注解标识实体类
    例如,创建一个简单的User实体类:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private String email;// 省略构造函数、getter和setter方法
}
  • 定义实体类的属性和关系(如@OneToMany@ManyToOne等关系注解)
    假设User实体类与Order实体类存在一对多的关系,可以这样定义:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import java.util.List;@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private String email;@OneToMany(mappedBy = "user")private List<Order> orders;// 省略构造函数、getter和setter方法
}

3. 编写数据访问层(Repository)

  • 使用@Repository注解创建Repository接口
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
  • 继承JpaRepository,利用其提供的方法
    JpaRepository提供了许多常用的数据库操作方法,如findByIdsavedeleteById等。例如,可以这样使用findById方法:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public User findUserById(Long id) {return userRepository.findById(id).orElse(null);}
}
  • 自定义查询方法(使用@Query注解)
    如果需要自定义查询方法,可以使用@Query注解。例如:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;@Repository
public interface UserRepository extends JpaRepository<User, Long> {@Query("SELECT u FROM User u WHERE u.email =?1")User findByEmail(String email);
}

五、数据库事务管理

1. 事务的概念和重要性

  • 在数据库操作中的作用
    事务是一组数据库操作,这些操作要么全部成功执行,要么全部失败回滚。在数据库操作中,事务用于确保数据的一致性和完整性。例如,在一个银行转账系统中,从一个账户扣款和向另一个账户存款这两个操作必须作为一个事务来处理,以确保转账过程中不会出现数据不一致的情况。

2. 在Spring Boot中管理事务

  • 使用@Transactional注解
    在Spring Boot中,可以使用@Transactional注解来标记需要事务管理的方法。例如:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Transactionalpublic void transferMoney(Long fromUserId, Long toUserId, double amount) {User fromUser = userRepository.findById(fromUserId).orElse(null);User toUser = userRepository.findById(toUserId).orElse(null);fromUser.setBalance(fromUser.getBalance() - amount);toUser.setBalance(toUser.getBalance() + amount);userRepository.save(fromUser);userRepository.save(toUser);}
}
  • 事务的传播行为和隔离级别
    事务的传播行为定义了事务方法在被其他事务方法调用时的行为。例如,REQUIRED传播行为表示如果当前存在事务,则加入该事务;如果不存在事务,则创建一个新事务。

事务的隔离级别用于控制多个事务并发访问数据库时的隔离程度。常见的隔离级别有READ_UNCOMMITTEDREAD_COMMITTEDREPEATABLE_READSERIALIZABLE。不同的隔离级别在数据一致性和并发性能方面有不同的权衡。

六、总结与展望

在本文中,我们深入探讨了Spring Boot与数据库的集成。我们了解了如何选择适合的数据库并添加相关依赖,如何配置数据库连接参数和使用数据源,如何使用JPA进行数据持久化,以及如何进行数据库事务管理。这些知识是构建数据驱动的Spring Boot应用的关键。

在下一篇文章中,我们将深入探讨Spring Boot中的安全机制,包括如何使用Spring Security来保护应用的安全,如身份验证、授权、保护Web资源等方面的内容。

相关文章:

【Spring Boot 入门三】Spring Boot与数据库集成 - 构建数据驱动的应用

一、引言 在之前的文章中&#xff0c;我们已经对Spring Boot有了初步的认识&#xff0c;了解了如何构建第一个Spring Boot应用&#xff0c;以及如何通过配置文件来掌控应用的设置。这些知识为我们进一步探索Spring Boot与数据库的集成奠定了坚实的基础。 数据库是现代应用的核…...

Web 服务器与动态脚本语言通信的接口协议有哪些

Web 服务器与动态脚本语言通信的接口协议主要有以下几种&#xff1a; 一、FastCGI&#xff08;Fast Common Gateway Interface&#xff09; 特点&#xff1a;使用持久进程处理请求&#xff0c;减少了进程启动和关闭的开销&#xff0c;提高了性能和可扩展性。多个请求可由同一个…...

ESXI识别服务器磁盘,虚拟机显示无效

ESXI识别服务器磁盘&#xff0c;虚拟机显示无效 系统意外断电识别不到磁盘的情况下可以管理-》硬件-》搜索磁盘名称&#xff0c;选择切换直通&#xff0c;则虚拟机正常。...

【C++】 vector 迭代器失效问题

【C】 vector 迭代器失效问题 一. 迭代器失效问题分析二. 对于vector可能会导致其迭代器失效的操作有&#xff1a;1. 会引起其底层空间改变的操作&#xff0c;都有可能是迭代器失效2. 指定位置元素的删除操作--erase3. Linux下&#xff0c;g编译器对迭代器失效的检测并不是非常…...

【Spring基础3】- Spring的入门程序

目录 3-1 Spring的下载3-2 Spring的 jar 包3-3 第一个 Spring程序第一步&#xff1a;添加spring context的依赖&#xff0c;pom.xml配置如下第二步&#xff1a;添加junit依赖第三步&#xff1a;定义bean&#xff1a;User第四步&#xff1a;编写spring的配置文件&#xff1a;bea…...

golang学习笔记22-面向对象(四):接口【重要】

本节也是GO核心部分&#xff0c;很重要。 注&#xff1a;由于导包语句已经在19讲&#xff08;笔记19&#xff1a;面向对象的引入&#xff09;展示过了&#xff0c;所以这里就不展示了。 一、定义与实现 (1)接口中可以定义一组方法&#xff0c;但不需要实现&#xff0c;不需要…...

SpringBoot技术栈:打造下一代网上租赁系统

第2章 关键技术简介 2.1 Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xf…...

Vue-Lecture1-Notes

渐进式框架 Vue 被称为“渐进式框架”&#xff0c;是因为它允许开发者根据项目的需求逐步引入和使用其功能&#xff0c;而不需要一次性使用整个框架。简单来说&#xff0c;Vue 提供了从简单到复杂的功能层次&#xff0c;可以灵活选择使用。 按需使用&#xff1a;Vue 的核心功能…...

网上租赁系统开发:SpringBoot实践与应用

第2章 关键技术简介 2.1 Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xf…...

User-Agent在WebMagic爬虫中的重要性

对于需要从网站上抓取数据的开发者来说&#xff0c;WebMagic是一个强大的工具。它是一个简单灵活的Java爬虫框架&#xff0c;用于抓取网页数据。在爬虫技术中&#xff0c;User-Agent&#xff08;用户代理&#xff09;是一个关键的HTTP请求头&#xff0c;它告诉服务器关于客户端…...

如何解决 Docker 下载 mcr.microsoft.com 镜像慢的办法

一、介绍 MCR(Miscrosoft Container Registry) 加速器&#xff0c;助你在中国大陆急速下载 netcore 相关的 docker 镜像。二、解决办法。     1、如何使用       至少三种方法进行加速&#xff1a;         使用 docker-mcr &#xff08;推荐&#xff09;  …...

网络编程,端口号,网络字节序,udp

前面一篇我们讲了网络的基础&#xff0c;网络协议栈是什么样的&#xff0c;数据如何流动传输的&#xff1b;接下来这篇&#xff0c;我们将进行实践操作&#xff0c;真正的让数据跨网络进行传输&#xff1b; 1.网络编程储备知识 1.1 初步认识网络编程 首先我们需要知道我们的…...

Android入门

下载Android studio&#xff0c;创建第一个项目 模板可以选择empty views Activity 在这个界面可以修改&#xff0c;使用语言&#xff0c;项目名字&#xff0c;存储路径以及适用版本 完成后&#xff0c;得到一个最初始的Android 项目&#xff0c;红色标记的两个文件&#xf…...

二叉树深搜专题篇

目录 计算布尔二叉树的值 求根节点到叶节点数字之和 二叉树剪枝 验证二叉搜索树 二叉搜索树中第K小的元素 二叉树的所有路径 计算布尔二叉树的值 题目 思路 这道题其实是比较简单的&#xff0c;对二叉树来一次后序遍历即可&#xff0c;当遇到叶子结点直接返回叶子节点中…...

堆【数据结构C语言版】【 详解】

目录-笔记整理 一、思考二、堆概念与性质三、堆的构建、删除、添加1. 构建2. 删除3. 添加 四、复杂度分析4.1 时间复杂度4.2 空间复杂度 五、总结 一、思考 设计一种数据结构&#xff0c;来存放整数&#xff0c;要求三个接口&#xff1a; 1&#xff09;获取序列中的最值&#…...

初识React

在最新写需求的时候&#xff0c;我遇到了一个需求&#xff0c;这个需求改后端改的不算多&#xff0c;而且也比较简单&#xff0c;但是在改前端的时候&#xff0c;很复杂。因为我们这个项目用的是React做前端的&#xff0c;而我对于前端知识没有了解&#xff0c;所以理解很多代码…...

VUE 开发——AJAX学习(三)

一、async函数和await async和await关键字让我们可以用一种更简洁的方式写出基于Promise的异步行为&#xff0c;而无需刻意地链式调用Promise async写在函数声明的前面&#xff1b;在async函数内&#xff0c;使用await关键字&#xff0c;获取Promise对象“成功状态”结果值 &…...

C++杂项

作业&#xff1a; 将之前实现的顺序表、栈、队列都更改成模板类 顺序表 #include <iostream>using namespace std;template<typename T>class SeqList { private:T *ptr;int size; //总长度int len 0; //当前顺序表实际长度public://初始…...

Gelatinous Cube Sphere - Bonus Files 2 - Atavism

这是Gelatinous Cube & Sphere Pack的奖励文件包。 奖励文件&#xff1a; ⭐ 概念艺术 也可在Monster Bundle #2中使用。 下载&#xff1a;​​Unity资源商店链接资源下载链接...

锐捷—NAT地址映射+IPsec隧道

任务目标 在出口路由器R3上将R5私网地址1对1映射的公网地址与R1建立IPsec隧道&#xff0c;使得R4在访问R5的映射公网地址时&#xff0c;可以进行IPsec隧道的转发 要求&#xff1a; 1、R4和R5可通过NAT转换正常访问互联网地址&#xff08;R2的lo0&#xff09; 2、R5的私网地…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

【51单片机】4. 模块化编程与LCD1602Debug

1. 什么是模块化编程 传统编程会将所有函数放在main.c中&#xff0c;如果使用的模块多&#xff0c;一个文件内会有很多代码&#xff0c;不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里&#xff0c;在.h文件里提供外部可调用函数声明&#xff0c;其他.c文…...