springboot嵌入式数据库实践-H2内嵌数据库(文件、内存)

news2024/9/22 17:20:31

本文章记录笔者的嵌入式数据库简单实现,

记录简要的配置过程。自用文章,仅作参考。

目录

本文章记录笔者的嵌入式数据库简单实现,

记录简要的配置过程。自用文章,仅作参考。

嵌入式数据库

-------------------------------具体操作步骤------------------------------

1.导入依赖(Maven)

2.配置文件(application.properties)

        A.文件数据库(本文示例)

        B.内存数据库

       C.DB_CLOSE_DELAY=-1(建议设置)对上述两者的影响:

        D.主键生成策略(更详细的内容请自行查阅)

3.代码实现

        A.创建实体类(创建数据库表)

        B.创建持久层

4.配置完成,本次仅为简单的示例。

5.测试

在配置类下,编写如下代码,并运行

6.查看数据库

我们可以使用IDEA内置的数据库控制台查看数据库内容,打开数据库源和驱动程序编辑


嵌入式数据库

嵌入式数据库是一种轻量级的数据库管理系统,它被设计为直接嵌入到应用程序中运行,而不是作为独立的数据库服务器运行。

-------------------------------具体操作步骤------------------------------

1.导入依赖(Maven)

2.配置文件(application.properties)

spring.application.name=embedded_databases
# 文件数据库
spring.datasource.url=jdbc:h2:file:./data/embedded;DB_CLOSE_DELAY=-1

# 内存数据库
#spring.datasource.url=jdbc:h2:mem:embedded;DB_CLOSE_DELAY=-1


# 主键生成策略
spring.jpa.hibernate.ddl-auto=create

        以下两种数据库存储形式自行选择

        A.文件数据库(本文示例)

                顾名思义,数据保存在文件中。

        B.内存数据库

                顾名思义,数据保存在内存中。

       C.DB_CLOSE_DELAY=-1(建议设置)对上述两者的影响:

  • 文件数据库:即使文件数据库被关闭,DB_CLOSE_DELAY=-1 会保持数据库的打开状态直到 JVM 进程结束,确保数据不会丢失。即使你保存到文件中,通常仍然会使用这个设置以避免频繁关闭和重新打开数据库。

  • 内存数据库:如果你使用的是内存数据库(例如 jdbc:h2:mem:testdb),则 DB_CLOSE_DELAY 设置会影响数据库的生命周期。通常,内存数据库会在 JVM 结束时自动丢弃数据。对于内存数据库,DB_CLOSE_DELAY=-1 设置不会有实际作用,因为内存数据库本质上不会保存到磁盘。

        D.主键生成策略(更详细的内容请自行查阅)

create:
每次应用启动时,会根据实体类创建新的数据库表结构。如果数据库中已经存在表,会先删除旧表再创建新表。这在开发阶段很有用,但在生产环境中使用可能会导致数据丢失。

create-drop:
在应用启动时创建数据库表结构,在应用关闭时删除这些表。同样适用于开发阶段,不适合生产环境。

update:
会根据实体类的变化更新数据库表结构。如果有新的实体类或实体类的属性发生了变化,会尝试对数据库表进行相应的修改。这在开发阶段可以避免频繁删除和创建表,但也需要谨慎使用,以免意外修改生产数据库。

validate:
不会对数据库表结构进行任何修改,只是验证实体类与数据库表结构是否匹配。如果不匹配,会在启动时抛出错误。这在生产环境中可以用于确保数据库结构与应用程序的预期一致。

none:
不执行任何数据库模式操作。完全由开发人员手动管理数据库表结构的创建和修改。在生产环境中通常使用这个值,以避免意外的数据库结构更改。

               create适合开发测试环境,故作为本次选择。

3.代码实现

        A.创建实体类(创建数据库表)

import jakarta.persistence.*;
import lombok.NoArgsConstructor;

/**
* 实体类,映射到数据库的表.
* @author Al Elijah
* create date: 2024/8/23
*/
@Entity
@Table(name = "MY_USER")
@Data
@NoArgsConstructor
public class MyUser {
    // 主键
    @Id
    // 主键生成策略(主键自增)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Integer id;

    String name;
    String password;

    public MyUser(String name, String password) {
        this.name = name;
        this.password = password;
    }
}

        代码分析:

  • @Entity注解用于将一个普通的 Java 类标记为一个 JPA(Java Persistence API)实体类。这意味着这个类的对象可以被持久化到数据库中。当使用 JPA 框架时,框架会识别带有@Entity注解的类,并将其映射到数据库中的一张表。
  • @Table(name = "MY_USER")明确指定了这个实体类对应的数据库表名为MY_USER。这在以下情况下很有用:
    • 当希望表名与类名不同时,可以通过这个注解进行自定义。
    • 遵循特定的数据库命名规范,或者避免与数据库中的其他表名冲突。
  • @Id注解用于标识一个类中的属性作为数据库表的主键。主键是表中用于唯一标识每一行记录的字段。通过将一个属性标记为@Id,告诉 JPA(Java Persistence API)框架在进行数据库操作时,这个属性对应表中的主键列。
  • @GeneratedValue(strategy = GenerationType.IDENTITY)注解

    • 主键生成策略,strategy = GenerationType.IDENTITY表示使用数据库的自增主键生成策略。更多策略请关注官方文档。

        B.创建持久层

        

import org.h2.engine.User;
import org.springframework.data.repository.CrudRepository;

/**
* 持久层.
* @author Al Elijah
* create date: 2024/8/23
*/
@org.springframework.stereotype.Repository
public interface Repository extends CrudRepository<MyUser, Integer> {
    
}

                CruRepository<T, ID> T-实体类, ID-id数据类型

                注意:此处不声明任何方法,是因为extends CrudRepository可以继承基本的数库剧                            操作方法,包括插入(save)和查找(find),因此无需手动声明。

4.配置完成,本次仅为简单的示例。

5.测试

在配置类下,编写如下代码,并运行

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import xyz.ascion_hub.embedded_databases.UserRepository.Repository;
import xyz.ascion_hub.embedded_databases.mapper.MyUser;

@Slf4j
@SpringBootTest
class EmbeddedDatabasesApplicationTests {

    @Autowired
    Repository repository;
    @Test
    void contextLoads() {
        MyUser myUser = new MyUser("Al Elijah", "Al Elijah");
        repository.save(myUser);
        // 获取ID一定要在save方法之后,否则结果的null
        Integer id = myUser.getId();
        // 断言查询结果不为空
        assert repository.findById(id).isPresent();

    }

}

执行结果如下:

        即可说明运行配置,操作正常完成。

6.查看数据库

我们可以使用IDEA内置的数据库控制台查看数据库内容,打开数据库源和驱动程序编辑

将配置文件的url写入配置项即可,如果读者像笔者一样没有设置用户和密码,可以跳过编辑,只输入URL即可,最后测试连接通过即可。

最后,执行数据库操作即可得到想要的结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2071776.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数学基础(八)

一、假设检验 什么是假设&#xff1a; 对总体参数&#xff08;均值、比例等&#xff09;的具体数值所作的陈述。 什么是假设检验&#xff1a; 先对总体的参数提出某种假设&#xff0c;然后利用样本的信息判断假设是否成立的过程 假设检验的应用&#xff1a; 推广新的教育…

【C++ Primer Plus习题】4.10

问题: 解答: #include <iostream> #include <array> using namespace std;int main() {array<float, 3> grade;float average0;for (int i 0; i < 3; i){cout << "请输入第" << i 1 << "次跑40米的成绩:";cin &…

『功能项目』新输入系统【06】

我们打开上一篇04禁止射线穿透行为项目&#xff0c; 本章要做的事情是在Unity编辑器中添加 新输入系统 实现主角在场景中鼠标右键可以使主角 转向。 本次项目需要让Unity引擎重新启动所以先保存当前项目 再次打开项目后&#xff0c; 修改为Both 点击Apply前注意要先保存项目&a…

Apollo9.0 PNC源码学习之Planning模块—— Lattice规划(五):横向运动轨迹规划

参考文章: (1)自动驾驶规划理论与实践 (2)Apollo6.0代码Lattice算法详解——Part5: 生成横纵向轨迹 0 前言 横向运动轨迹规划主要对车辆方向盘转向的控制策略;求解方法分为基于s的5次多项式和基于二次规划的方法 2 基于s的5次多项式的横向运动轨迹的生成 纵向运动轨迹…

Linux环境使用docker搭建Navidrome本地个人音乐库并实现远程访问

文章目录 前言1. 安装Docker2. Docker镜像源添加方法3. 创建并启动Navidrome容器 前言 本文和大家分享一款目前在G站有11KStar的开源跨平台音乐服务器Navidrome&#xff0c;如何在Linux环境本地使用Docker部署&#xff0c;并结合cpolar内网穿透工具配置公网地址&#xff0c;实…

Docker安装Logstash,并结合logback实现ELK日志收集

拉取镜像 docker pull docker.elastic.co/logstash/logstash:8.14.3创建文件夹 mkdir /mnt/data/logstash创建默认文件 先不做目录挂载&#xff0c;run出一个容器 docker run -d --rm -it docker.elastic.co/logstash/logstash:8.14.3将config和pipeline从容器cp到宿主机 …

BEV学习---LSS-1:论文原理及代码串讲

目前在自动驾驶领域&#xff0c;比较火的一类研究方向是基于采集到的环视图像信息&#xff0c;去构建BEV视角下的特征完成自动驾驶感知的相关任务。所以如何准确的完成从相机视角向BEV视角下的转变就变得由为重要。目前感觉比较主流的方法可以大体分为两种&#xff1a; 1、显式…

Linux驱动.之字符设备驱动框架,及手动,自动注册创建/dev下设备节点详解(一)

一、Linux 字符设备驱动框架 Linux一切皆文件&#xff0c;通过VFS虚拟文件系统&#xff0c;把所有外设的细节都隐藏起来&#xff0c;最后都以文件的形态呈现于应用层&#xff0c; 操作设备&#xff0c;就像对文件的打开、关闭、读写、控制。这种方式完美的统一了对用户的接口&a…

WIN/MAC 图像处理软件Adobe Photoshop PS2024软件下载安装

目录 一、软件概述 1.1 基本信息 1.2 主要功能 二、系统要求 2.1 Windows 系统要求 2.2 macOS 系统要求 三、下载 四、使用教程 4.1 基本界面介绍 4.2 常用工具使用 4.3 进阶操作 一、软件概述 1.1 基本信息 Adobe Photoshop&#xff08;简称PS&#xff09;是一款…

快手怎么免费的去掉视频水印?分享这三个工具给你

​ 我们经常会遇到想要保存的视频带有水印&#xff0c;这不仅影响美观&#xff0c;也不利于分享。为了解决这个问题&#xff0c;我将分享三个免费去除视频水印的工具&#xff0c;帮助你轻松去除水印&#xff0c;享受无干扰的视频体验。 工具一&#xff1a;奈斯水印助手(小程序…

挑战Infiniband, 爆改Ethernet(3)

Infiniband的特点 Infiniband在HPC集群和AI集群中获得广泛应用是和Infiniband技术的特点密切相关的&#xff0c;今天我们看看Infiniband的技术特点: 1&#xff09;网络分层模型 这个分层模型并不是Infiniband技术独有的&#xff0c;各种现代网络技术都普遍采用分层模型来设计…

在.NET开发中使用 Excel 的最佳方式之一:MiniExcel

前言 在桌面开发应用中&#xff0c;处理 Excel 文件是一个非常常见的需求。无论是生成报表、导入数据&#xff0c;还是与客户或其他系统进行数据交换&#xff0c;Excel 文件都扮演着重要角色。在 .NET 生态系统中&#xff0c;有许多处理 Excel 文件的工具和库&#xff0c;其中…

Flutter ListView 实现不同样式 item

我们在实际开发中会创建显示不同类型内容的列表。以下是使用 Flutter 创建此类结构的方法&#xff1a; 1. 创建包含不同类型项目的数据源。 2. 将数据源转换为小部件列表。 创建包含不同类型项目的数据源 项目类型 要表示列表中不同类型的项目&#xff0c;请为每种类型的项目…

链表(静态/动态创建,遍历,计数,查找,在节点的前/后方插入新节点,头插法,尾插法)

目录 一、前言 二、链表的静态创建和遍历 三、链表统计节点&#xff0c;查找节点是否存在 四、从指定节点的后方插入新节点 五、从指定节点的前方插入新节点 六、动态创建链表&尾插法 七、头插法 八、删除节点 一、前言 链表本质是一个结构体&#xff0c;结构体里…

19448 算法设计与分析(第五版)习题2-7 集合划分问题

### 思路 1. **递归公式**&#xff1a;根据提示信息&#xff0c;递归公式为&#xff1a; - \( f(n, x) f(n-1, x-1) f(n-1, x) \times x \) - 其中&#xff0c;\( f(n, x) \) 表示将 \( n \) 个元素分成 \( x \) 个非空子集的方案数。 2. **边界条件**&#xff1a; …

【STM32】串口(异步通信部分)

经典的串口接口硬件说实话在现在的电脑上已经很难见到了&#xff0c;而是被USB这种通用的串行接口替代了&#xff0c;哪怕外部设备要以串口连接到电脑&#xff0c;都需要进行各种硬件转换。但不得不说&#xff0c;在工业领域&#xff0c;串口还是一个非常常用的数据传输方式。 …

LEAP模型在能源环境发展、碳排放建模预测及分析中实践应用

采用部门分析法建立的LEAP&#xff08;Long Range Energy Alternatives Planning System/ Low emission analysis platform&#xff0c;长期能源可替代规划模型&#xff09;是一种自下而上的能源-环境核算工具&#xff0c;由斯德哥尔摩环境研究所和美国波士顿大学联合研发。该模…

后端Web之登录校验(上篇)

目录 1.概述 2.会话技术 3.JWT令牌 1.概述 基础的登录功能实际上就是查询数据库中有没有输入的用户和密码&#xff0c;有就放行&#xff0c;没有就返回错误信息&#xff0c;根据三层架构进行开发&#xff1a; controller层&#xff1a; service层&#xff1a; mapper层&…

Visual C++ 的免费绘图库 EasyX下载安装

EasyX Graphics Library 是针对 Visual C++ 的免费绘图库,支持 VC6.0 ~ VC2022,简单易用,学习成本极低,应用领域广泛。目前已有许多大学将 EasyX 应用在教学当中。 下载地址:EasyX Graphics Library for C++ 1、应用 2、文中有很多的C++应用案例 3、编程需要的数学知识 …

19530 2的幂次方表示

### 思路 1. **分解为2的幂次方**&#xff1a;将输入的正整数n分解为若干个2的幂次方之和。 2. **递归表示**&#xff1a;使用递归的方法将每个幂次方表示为2的幂次方形式。 3. **组合结果**&#xff1a;将所有的幂次方表示组合成最终的结果。 ### 需要注意的点 - 需要处理幂次…