【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.properties
或application.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
提供了许多常用的数据库操作方法,如findById
、save
、deleteById
等。例如,可以这样使用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_UNCOMMITTED
、READ_COMMITTED
、REPEATABLE_READ
和SERIALIZABLE
。不同的隔离级别在数据一致性和并发性能方面有不同的权衡。
六、总结与展望
在本文中,我们深入探讨了Spring Boot与数据库的集成。我们了解了如何选择适合的数据库并添加相关依赖,如何配置数据库连接参数和使用数据源,如何使用JPA进行数据持久化,以及如何进行数据库事务管理。这些知识是构建数据驱动的Spring Boot应用的关键。
在下一篇文章中,我们将深入探讨Spring Boot中的安全机制,包括如何使用Spring Security来保护应用的安全,如身份验证、授权、保护Web资源等方面的内容。
相关文章:

【Spring Boot 入门三】Spring Boot与数据库集成 - 构建数据驱动的应用
一、引言 在之前的文章中,我们已经对Spring Boot有了初步的认识,了解了如何构建第一个Spring Boot应用,以及如何通过配置文件来掌控应用的设置。这些知识为我们进一步探索Spring Boot与数据库的集成奠定了坚实的基础。 数据库是现代应用的核…...
Web 服务器与动态脚本语言通信的接口协议有哪些
Web 服务器与动态脚本语言通信的接口协议主要有以下几种: 一、FastCGI(Fast Common Gateway Interface) 特点:使用持久进程处理请求,减少了进程启动和关闭的开销,提高了性能和可扩展性。多个请求可由同一个…...

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

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

【Spring基础3】- Spring的入门程序
目录 3-1 Spring的下载3-2 Spring的 jar 包3-3 第一个 Spring程序第一步:添加spring context的依赖,pom.xml配置如下第二步:添加junit依赖第三步:定义bean:User第四步:编写spring的配置文件:bea…...
golang学习笔记22-面向对象(四):接口【重要】
本节也是GO核心部分,很重要。 注:由于导包语句已经在19讲(笔记19:面向对象的引入)展示过了,所以这里就不展示了。 一、定义与实现 (1)接口中可以定义一组方法,但不需要实现,不需要…...

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

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

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

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

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

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

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

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

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

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

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

C++杂项
作业: 将之前实现的顺序表、栈、队列都更改成模板类 顺序表 #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的奖励文件包。 奖励文件: ⭐ 概念艺术 也可在Monster Bundle #2中使用。 下载:Unity资源商店链接资源下载链接...

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

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

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

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...