【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的私网地…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
