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

SpringBoot整合H2数据库并将其打包成jar包、转换成exe文件

SpringBoot整合H2数据库并将其打包成jar包、转换成exe文件

H2 是一个用 Java 开发的嵌入式数据库,它的主要特性使其成为嵌入式应用程序的理想选择。H2 仅是一个类库,可以直接嵌入到应用项目中,而无需独立安装客户端和服务器端。

常用开源数据库

常用的开源数据库包括 H2、Derby、HSQLDB、MySQL 和 PostgreSQL。相比之下,H2 和 HSQLDB 非常适合作为嵌入式数据库使用,而其他数据库大多需要安装独立的客户端和服务器端。

H2 数据库的优势
  1. 跨平台:H2 是用纯 Java 编写的,因此可以在任何支持 Java 的平台上运行。
  2. 简洁:H2 仅需一个 jar 文件,非常适合作为嵌入式数据库。
  3. 方便管理:H2 提供了一个方便的 web 控制台,用于操作和管理数据库内容。
  4. 功能齐全:支持标准 SQL 和 JDBC,功能完整。
  5. 多种模式:支持内嵌模式、服务器模式和集群。
H2 数据库的用途
  1. 嵌入式发布:H2 可以与应用程序一起打包发布,方便存储少量结构化数据。
  2. 单元测试:启动速度快,可以关闭持久化功能,每个用例执行完后可以还原到初始状态,非常适合单元测试。
  3. 缓存使用:作为关系型数据模型的缓存,H2 可以作为 NoSQL 的补充,用于缓存不经常变化但需要频繁访问的数据,如字典表和权限表。

H2数据库的几种模式:

1. 本地模式(Local Mode)

特点

  • 在本地模式下,H2数据库文件存储在本地文件系统中。数据库仅能由同一应用程序实例访问。
  • 这种模式不需要网络连接,数据库文件存放在本地硬盘上,通常用于单用户应用或开发和测试阶段。

适用场景

  • 单用户应用程序。
  • 开发和测试阶段。
  • 不需要远程访问的嵌入式应用。

连接方式

  • 通过JDBC URL连接,例如:jdbc:h2:~/testjdbc: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 开发的嵌入式数据库&#xff0c;它的主要特性使其成为嵌入式应用程序的理想选择。H2 仅是一个类库&#xff0c;可以直接嵌入到应用项目中&#xff0c;而无需独立安装客户端和服务器端。 常用开源数…...

web前端文本大小:从入门到精通的全方位解析

web前端文本大小&#xff1a;从入门到精通的全方位解析 在web前端开发的世界中&#xff0c;文本大小的处理既是基础也是关键的一环。无论是对于初学者还是资深开发者&#xff0c;正确且有效地处理文本大小都显得尤为重要。本文将从四个方面、五个方面、六个方面和七个方面&…...

【报文数据流中的反压处理】

报文数据流中的反压处理 1 带存储体的反压1.1 原理图1.2 Demo 尤其是在NP芯片中&#xff0c;经常涉及到报文的数据流处理&#xff1b;为了防止数据丢失&#xff0c;和各模块的流水处理&#xff1b;因此需要到反压机制&#xff1b; 反压机制目前接触到的有两种&#xff1a;一是基…...

数据挖掘丨轻松应用RapidMiner机器学习内置数据分析案例模板详解(下篇)

RapidMiner 案例模板 RapidMiner 机器学习平台提供了一个可视化的操作界面&#xff0c;允许用户通过拖放的方式构建数据分析流程。RapidMiner目前内置了 13 种案例模板&#xff0c;这些模板是预定义的数据分析流程&#xff0c;可以帮助用户快速启动和执行常见的数据分析任务。 …...

时代巨兽!深度神经网络如何改变我们的世界?

深度神经网络 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.高可用&#xff08;HA&#xff09;群集与普通群集的比较 普通群集 高可用群集&#xff08;HA&#xff09; 两者比较 2.Keepalived高可用方案 3.Keepalived的体系模块及其作用 4.Keepalived实现原理 二.LVSKeepAlived高可用负载均衡集群的…...

【MySQL】MySQL45讲-读书笔记

1、基础架构&#xff1a;一条SQL查询语句是如何执行的&#xff1f; 1.1 连接器 连接器负责跟客户端建立连接、获取权限、维持和管理连接。 mysql -h$ip -P$port -u$user -p输完命令之后&#xff0c;输入密码。 1.2 查询缓存 MySQL 拿到一个查询请求后&#xff0c;会先到查询缓…...

python:faces swap

# encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看&#xff1a; 两个头像图片之间换脸 # 描述&#xff1a; https://stackoverflow.com/questions/902761/saving-a-numpy-array-as-an-image?answertabvotes # Author : geovindu,Geovin Du 涂聚文. #…...

Android开发之音乐播放器添加排行需求

Music统计功能需求 1.记录歌曲名称与次数(歌曲播放结束算一次)&#xff0c;根据播放次数制作一个排行列表;&#xff08;开始说要记录歌手&#xff0c;后面debug发现这个字段没有&#xff0c;暂时不记录&#xff09; 2.记录播放歌曲的时长&#xff0c;时间累加&#xff1b;&…...

latex 方括号编号

最近在做简历&#xff0c;需要列出发表的论文。 论文编号一般是采用[1]这种样式&#xff0c;但是找了几个简历模板里头没有直接包含这种编号样式。 我只好求助网络。 在CSDN上找了一圈&#xff0c;这篇博客给了一个思路&#xff1a;在\begin{enumerate}后面添加对应的样式即…...

Vue CLI 4与项目构建实战指南

title: Vue CLI 4与项目构建实战指南 date: 2024/6/9 updated: 2024/6/9 excerpt: 这篇文章介绍了如何使用Vue CLI优化项目构建配置&#xff0c;提高开发效率&#xff0c;涉及配置管理、项目部署策略、插件系统定制以及Webpack和TypeScript的深度集成技巧。 categories: 前端…...

深入解析Web通信 HTTP、HTTPS 和 WebSocket

在现代Web开发中,了解和掌握HTTP、HTTPS以及WebSocket协议是非常重要的。这些协议是实现Web应用程序之间通信的基石。本文将详细介绍这三种协议,包括它们的基本概念、工作原理、优缺点以及适用场景。通过深入解析它们的特点和应用,帮助读者更好地理解和使用这些协议。 一、…...

FISCO BCOS x GitLink,为国产开源技术生态注入新活力

作为中国领先的区块链底层平台之一&#xff0c;FISCO BCOS 自成立以来始终致力于推动国产开源区块链技术的应用和普及。近期&#xff0c;FISCO BCOS 将开源代码托管到CCF官方代码托管平台 GitLink &#xff08;确实开源&#xff09;&#xff0c;为国产开源技术生态注入新活力。…...

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 微内核看起来又稳定又容易调试&#xff0c;为…...

[Llama3] ReAct Prompt 测试实验

ReAct 是一种 LLM 提示和结果处理方法&#xff0c;结合了推理、行动计划和知识源整合&#xff0c;使 LLM 超越其语言模型&#xff0c;并在预测中使用来自现实世界的信息。 ReAct 是推理和行动的结合。 介绍 ReAct 的论文表明它比思维链提示更好。与后者不同的是&#xff0c;Re…...

nodejs 某音douyin网页端搜索接口及x_bogus、a_bogus(包含完整源码)(2024-06-13)

前言 x_bogus或a_bogus算法大概是对数据、ua、时间戳、浏览器的几个指纹进行计算&#xff0c;拿到一个110位大数组&#xff0c;然后转字符&#xff0c;在头部再添加十二位随机字符&#xff0c;再进行魔改的base64加密。 问&#xff1a;抖音的x_bogus、a_bogus值有什么用&#x…...

继承深度剖析

前言 从继承开始就开始C进阶了&#xff0c; 这一块需要好好学习&#xff0c;这块知识很重要&#xff0c; 坑有点多&#xff0c;所以是面试笔试的常客。 基本概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c; 它允许程序员在保持原有…...

使用 Vue 和 Ant Design 实现抽屉效果的模块折叠功能

功能描述&#xff1a; 有两个模块&#xff0c;点击上面模块的收起按钮时&#xff0c;上面的模块可以折叠&#xff0c;下面的模块随之扩展 代码实现&#xff1a; 我们在 Vue 组件中定义两个模块的布局和状态管理&#xff1a; const scrollTableY ref(560); // 表格初始高度…...

Springboot整合SpringCache+redis简化缓存开发

使用步骤&#xff1a; 1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId> </dependency><dependency><groupId>org.springframework.boot</groupI…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

动态规划-1035.不相交的线-力扣(LeetCode)

一、题目解析 光看题目要求和例图&#xff0c;感觉这题好麻烦&#xff0c;直线不能相交啊&#xff0c;每个数字只属于一条连线啊等等&#xff0c;但我们结合题目所给的信息和例图的内容&#xff0c;这不就是最长公共子序列吗&#xff1f;&#xff0c;我们把最长公共子序列连线起…...

Java中栈的多种实现类详解

Java中栈的多种实现类详解&#xff1a;Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...