SpringBoot整合H2数据库并将其打包成jar包、转换成exe文件
SpringBoot整合H2数据库并将其打包成jar包、转换成exe文件
H2 是一个用 Java 开发的嵌入式数据库,它的主要特性使其成为嵌入式应用程序的理想选择。H2 仅是一个类库,可以直接嵌入到应用项目中,而无需独立安装客户端和服务器端。
常用开源数据库
常用的开源数据库包括 H2、Derby、HSQLDB、MySQL 和 PostgreSQL。相比之下,H2 和 HSQLDB 非常适合作为嵌入式数据库使用,而其他数据库大多需要安装独立的客户端和服务器端。
H2 数据库的优势
- 跨平台:H2 是用纯 Java 编写的,因此可以在任何支持 Java 的平台上运行。
 - 简洁:H2 仅需一个 jar 文件,非常适合作为嵌入式数据库。
 - 方便管理:H2 提供了一个方便的 web 控制台,用于操作和管理数据库内容。
 - 功能齐全:支持标准 SQL 和 JDBC,功能完整。
 - 多种模式:支持内嵌模式、服务器模式和集群。
 
H2 数据库的用途
- 嵌入式发布:H2 可以与应用程序一起打包发布,方便存储少量结构化数据。
 - 单元测试:启动速度快,可以关闭持久化功能,每个用例执行完后可以还原到初始状态,非常适合单元测试。
 - 缓存使用:作为关系型数据模型的缓存,H2 可以作为 NoSQL 的补充,用于缓存不经常变化但需要频繁访问的数据,如字典表和权限表。
 
H2数据库的几种模式:
1. 本地模式(Local Mode)
特点:
- 在本地模式下,H2数据库文件存储在本地文件系统中。数据库仅能由同一应用程序实例访问。
 - 这种模式不需要网络连接,数据库文件存放在本地硬盘上,通常用于单用户应用或开发和测试阶段。
 
适用场景:
- 单用户应用程序。
 - 开发和测试阶段。
 - 不需要远程访问的嵌入式应用。
 
连接方式:
- 通过JDBC URL连接,例如:
jdbc:h2:~/test或jdbc:h2:file:/data/sample。 
2. 网络模式(Network Mode)
特点:
- 网络模式下,H2数据库作为一个独立的服务器进程运行,可以通过网络连接进行访问。这允许多个客户端通过TCP/IP协议连接到同一个数据库实例。
 - 数据库服务器可以在一台机器上运行,而客户端可以在同一台机器或不同的机器上运行,通过网络进行访问。
 
适用场景:
- 多用户应用程序。
 - 需要远程访问数据库的分布式系统。
 - Web应用程序。
 
连接方式:
- 通过JDBC URL连接,例如:
jdbc:h2:tcp://localhost/~/test。 - 启动服务器的命令例如:
java -cp h2*.jar org.h2.tools.Server -tcp -tcpAllowOthers -tcpPort 9092 
3. 内存模式(In-Memory Mode)
特点:
- 在内存模式下,H2数据库完全驻留在内存中,数据不会持久化到磁盘上。数据库在应用程序关闭或重新启动时将丢失所有数据。
 - 内存模式提供了非常高的性能,因为所有数据都在内存中,避免了磁盘I/O操作。
 
适用场景:
- 需要高性能的数据处理。
 - 临时数据存储。
 - 单元测试和自动化测试环境。
 
连接方式:
- 通过JDBC URL连接,例如:
jdbc:h2:mem:test。 
我这次用的是本地文件模式,数据库仅能由同一应用程序实例访问,所以比较难搞。
下载安装H2
官网下载即可:H2 Database Engine
创建表
CREATE TABLE students (roll_num BIGINT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(255) NOT NULL,age INT NOT NULL
); 
创建一个SpringBoot项目
项目架构

建一个data文件夹
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.2</version> <!-- 确保版本正确 --><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.lm</groupId><artifactId>SH2M</artifactId><version>1.0-SNAPSHOT</version><name>SH2M</name><description>Demo project for Spring Boot</description><properties><java.version>17</java.version><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target></properties><dependencies><!-- Spring Boot Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- Spring Boot Web Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot Starter Data JPA --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- H2 Database --><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><version>2.2.224</version> <!-- 指定的H2版本 --></dependency><!-- Spring Boot DevTools --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency><!-- Lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency><!-- JAXB API --><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId></dependency></dependencies><build><finalName>SH2M</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions><configuration><mainClass>com.lm.Application</mainClass> <!-- 确保主类名正确 --></configuration></plugin></plugins></build>
</project> 
主启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args)  {SpringApplication.run(Application.class, args);}
} 
实体类
import lombok.Data;import javax.persistence.*;
import java.io.Serializable;@Data
@Entity
@Table(name="students")
public class Student implements Serializable {private static final long serialVersionUID = 1L;@Id@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "student_seq")@SequenceGenerator(name = "student_seq", sequenceName = "HIBERNATE_SEQUENCE", allocationSize = 1)@Column(name="roll_num")private Long rollNum;@Column(name="name")private String name;@Column(name="age")private int age;//setters and getters
}
 
StudentRepository
import com.lm.entity.Student;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Component;@Component
public interface StudentRepository extends JpaRepository<Student, Long> {Student findByName(String name);
} 
服务接口
import com.lm.entity.Student;import java.util.List;
public interface IStudentService {List<Student> getAllStudents();Student getStudentByRollNum(Long rollNum);Student getStudentByName(String name);boolean addStudent(Student student);void updateStudent(Student student);void deleteStudent(Long rollNum);
}
 
具体实现类
import com.lm.entity.Student;
import com.lm.repository.StudentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.List;
import java.util.UUID;@Service
public class StudentService implements IStudentService {@Autowiredprivate StudentRepository studentRepository;@Overridepublic Student getStudentByRollNum(Long rollNum) {Student obj = studentRepository.findById(rollNum).get();return obj;}@Overridepublic Student getStudentByName(String name) {Student byName = studentRepository.findByName(name);return byName;}@Overridepublic List<Student> getAllStudents() {List<Student> list = new ArrayList<>();studentRepository.findAll().forEach(e -> list.add(e));return list;}@Overridepublic boolean addStudent(Student student) {studentRepository.save(student);return true;}@Overridepublic void updateStudent(Student student) {studentRepository.save(student);}@Overridepublic void deleteStudent(Long rollNum) {studentRepository.delete(getStudentByRollNum(rollNum));}
} 
application.properties
# Tomcat
server.port=8081#Datasource Configuration
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=root
spring.datasource.password=123456#JPA Configuration
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
#Connection Pool Configuration
spring.datasource.hikari.connection-timeout=20000
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=12
spring.datasource.hikari.idle-timeout=300000
spring.datasource.hikari.max-lifetime=1200000spring.h2.console.path=/h2
spring.h2.console.settings.trace=false
spring.h2.console.settings.web-allow-others=true spring.h2.console.enabled=truespring.datasource.url=jdbc:h2:file:./data/demo;AUTO_RECONNECT=TRUE;AUTO_SERVER=FALSE;FILE_LOCK=SOCKET
spring.datasource.driverClassName=org.h2.Driver
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect 
用Maven自带的package打包项目成jar
用launch4j将jar转成exe
建一个exe文件夹,将launch4j-3.50-win32.exe以及jre放入其中。
launch4j链接:https://sourceforge.net/projects/launch4j/files/latest/download
jre链接:https://www.alipan.com/s/wCRbfXzSWVM
 提取码:6hd1
打开launch4j

注意:输出文件位置要写到文件的具体名称如:C:/asd.exe
java download URL: http://java.com/download
 
 
这时候你们应该会有这个文件

现在就可以运行了,但是它的运行是不显示的,只在后台运行。
运行成功:
点击exe文件,等待一会儿再访问相应接口
关闭方法
我们需要一个手动关闭的脚本
链接:https://www.alipan.com/s/4ox9JH3gJZH
提取码:00xf
现在点击这个就可以手动关闭。
或者通过接口http://localhost:8081/shutdown也可以进行关闭。
相关文章:
SpringBoot整合H2数据库并将其打包成jar包、转换成exe文件
SpringBoot整合H2数据库并将其打包成jar包、转换成exe文件 H2 是一个用 Java 开发的嵌入式数据库,它的主要特性使其成为嵌入式应用程序的理想选择。H2 仅是一个类库,可以直接嵌入到应用项目中,而无需独立安装客户端和服务器端。 常用开源数…...
web前端文本大小:从入门到精通的全方位解析
web前端文本大小:从入门到精通的全方位解析 在web前端开发的世界中,文本大小的处理既是基础也是关键的一环。无论是对于初学者还是资深开发者,正确且有效地处理文本大小都显得尤为重要。本文将从四个方面、五个方面、六个方面和七个方面&…...
【报文数据流中的反压处理】
报文数据流中的反压处理 1 带存储体的反压1.1 原理图1.2 Demo 尤其是在NP芯片中,经常涉及到报文的数据流处理;为了防止数据丢失,和各模块的流水处理;因此需要到反压机制; 反压机制目前接触到的有两种:一是基…...
数据挖掘丨轻松应用RapidMiner机器学习内置数据分析案例模板详解(下篇)
RapidMiner 案例模板 RapidMiner 机器学习平台提供了一个可视化的操作界面,允许用户通过拖放的方式构建数据分析流程。RapidMiner目前内置了 13 种案例模板,这些模板是预定义的数据分析流程,可以帮助用户快速启动和执行常见的数据分析任务。 …...
时代巨兽!深度神经网络如何改变我们的世界?
深度神经网络 1、 简介1.1 定义深度神经网络1.2 深度学习的发展历程1.3 深度神经网络的应用领域 2、深度神经网络的基本原理2.1 神经元层2.1.1 神经元2.1.2 神经元层 2.2 前向传播2.3 反向传播2.4 激活函数2.4.1、作用2.4.2、常见激活函数2.4.3、选择激活函数的考虑 2.5 损失函…...
LVS+Keepalived高可用负载均衡群集
目录 一.高可用群集相关概述 1.高可用(HA)群集与普通群集的比较 普通群集 高可用群集(HA) 两者比较 2.Keepalived高可用方案 3.Keepalived的体系模块及其作用 4.Keepalived实现原理 二.LVSKeepAlived高可用负载均衡集群的…...
【MySQL】MySQL45讲-读书笔记
1、基础架构:一条SQL查询语句是如何执行的? 1.1 连接器 连接器负责跟客户端建立连接、获取权限、维持和管理连接。 mysql -h$ip -P$port -u$user -p输完命令之后,输入密码。 1.2 查询缓存 MySQL 拿到一个查询请求后,会先到查询缓…...
python:faces swap
# encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看: 两个头像图片之间换脸 # 描述: https://stackoverflow.com/questions/902761/saving-a-numpy-array-as-an-image?answertabvotes # Author : geovindu,Geovin Du 涂聚文. #…...
Android开发之音乐播放器添加排行需求
Music统计功能需求 1.记录歌曲名称与次数(歌曲播放结束算一次),根据播放次数制作一个排行列表;(开始说要记录歌手,后面debug发现这个字段没有,暂时不记录) 2.记录播放歌曲的时长,时间累加;&…...
latex 方括号编号
最近在做简历,需要列出发表的论文。 论文编号一般是采用[1]这种样式,但是找了几个简历模板里头没有直接包含这种编号样式。 我只好求助网络。 在CSDN上找了一圈,这篇博客给了一个思路:在\begin{enumerate}后面添加对应的样式即…...
Vue CLI 4与项目构建实战指南
title: Vue CLI 4与项目构建实战指南 date: 2024/6/9 updated: 2024/6/9 excerpt: 这篇文章介绍了如何使用Vue CLI优化项目构建配置,提高开发效率,涉及配置管理、项目部署策略、插件系统定制以及Webpack和TypeScript的深度集成技巧。 categories: 前端…...
深入解析Web通信 HTTP、HTTPS 和 WebSocket
在现代Web开发中,了解和掌握HTTP、HTTPS以及WebSocket协议是非常重要的。这些协议是实现Web应用程序之间通信的基石。本文将详细介绍这三种协议,包括它们的基本概念、工作原理、优缺点以及适用场景。通过深入解析它们的特点和应用,帮助读者更好地理解和使用这些协议。 一、…...
FISCO BCOS x GitLink,为国产开源技术生态注入新活力
作为中国领先的区块链底层平台之一,FISCO BCOS 自成立以来始终致力于推动国产开源区块链技术的应用和普及。近期,FISCO BCOS 将开源代码托管到CCF官方代码托管平台 GitLink (确实开源),为国产开源技术生态注入新活力。…...
Linux crontabs定时执行任务
文章目录 前言一、安装二、服务1. 启动crond服务2. 关闭crond服务3. 重启crond服务4. 设置crond开机启动5. 禁用crond开机启动6. 查看crond是否开机启动7. 重新载入配置8. 查看crond运行状态 三、使用1. 查看当前用户的crontab2. 编辑用户的crontab3. 删除用户的crontab的内容 …...
QNX简述
文章目录 前言1. QNX简介1.1 什么是QNX1.2 QNX的应用场景1.3 QNX的优点1.4 QNX的发展史1.5 QNX的商业模式 2. QNX的技术特点3. QNX和其它操作系统的比较3.1 QNX VS LINUX3.2 QNX VS FreeRTOS3.3 QNX VS 鸿蒙操作系统 4. 我的疑问4.1 微内核看起来又稳定又容易调试,为…...
[Llama3] ReAct Prompt 测试实验
ReAct 是一种 LLM 提示和结果处理方法,结合了推理、行动计划和知识源整合,使 LLM 超越其语言模型,并在预测中使用来自现实世界的信息。 ReAct 是推理和行动的结合。 介绍 ReAct 的论文表明它比思维链提示更好。与后者不同的是,Re…...
nodejs 某音douyin网页端搜索接口及x_bogus、a_bogus(包含完整源码)(2024-06-13)
前言 x_bogus或a_bogus算法大概是对数据、ua、时间戳、浏览器的几个指纹进行计算,拿到一个110位大数组,然后转字符,在头部再添加十二位随机字符,再进行魔改的base64加密。 问:抖音的x_bogus、a_bogus值有什么用&#x…...
继承深度剖析
前言 从继承开始就开始C进阶了, 这一块需要好好学习,这块知识很重要, 坑有点多,所以是面试笔试的常客。 基本概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段, 它允许程序员在保持原有…...
使用 Vue 和 Ant Design 实现抽屉效果的模块折叠功能
功能描述: 有两个模块,点击上面模块的收起按钮时,上面的模块可以折叠,下面的模块随之扩展 代码实现: 我们在 Vue 组件中定义两个模块的布局和状态管理: const scrollTableY ref(560); // 表格初始高度…...
Springboot整合SpringCache+redis简化缓存开发
使用步骤: 1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId> </dependency><dependency><groupId>org.springframework.boot</groupI…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
