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也可以进行关闭。

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

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

相关文章

网页自动化工具入门篇之常用自动化工具

1. Selenium 优点: 功能强大&#xff0c;可以与几乎所有的现代浏览器配合使用。支持多种编程语言&#xff08;如Python, Java, C#, Ruby等&#xff09;。能够处理复杂的网页交互&#xff0c;包括按钮点击、表单填写、拖拽操作等。 缺点: 相对较慢&#xff0c;因为它是真正启动…

Linux Debian12使用podman安装pikachu靶场环境

一、pikachu简介 Pikachu是一个带有漏洞的Web应用系统&#xff0c;在这里包含了常见的web安全漏洞。 二、安装podman环境 Linux Debian系统如果没有安装podman容器环境&#xff0c;可以参考这篇文章先安装podman环境&#xff0c; Linux Debian11使用国内源安装Podman环境 三…

【Numpy】一文向您详细介绍 np.trunc()

【Numpy】一文向您详细介绍 np.trunc() 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&#xff0c;…

[数据集][目标检测]中国象棋检测数据集VOC+YOLO格式300张12类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;300 标注数量(xml文件个数)&#xff1a;300 标注数量(txt文件个数)&#xff1a;300 标注类别…

Django后台忘记管理员的账号

使用命令启动项目&#xff1a; python manage.py runserver输入后缀/admin&#xff0c;进入后台管理员&#xff0c;如果此时忘记你先前设置的用户名与密码怎么办&#xff1f; 终端输入&#xff1a; python manage.py shell 输入以下内容&#xff0c;并查看返回结果&#xff…

用【R语言】揭示大学生恋爱心理:【机器学习】与【深度学习】的案例深度解析

目录 第一部分&#xff1a;数据收集与预处理 1.1 数据来源 1.2 数据清洗 1.3 数据探索性分析 第二部分&#xff1a;特征工程与数据准备 2.1 特征选择 2.2 特征提取 第三部分&#xff1a;机器学习模型 3.1 逻辑回归模型 3.2 决策树模型 第四部分&#xff1a;深度学习…

spark MLlib (DataFrame-based) 中的聚类算法Bisecting K-Means、K-Means、Gaussian Mixture

Bisecting K-Means 核心原理&#xff1a; Bisecting K-Means 是一种层次 K-Means 聚类算法&#xff0c;基于 Steinbach、Karypis 和 Kumar 的论文《A comparison of document clustering techniques》&#xff0c;并对 Spark 环境进行了修改和适应。 该算法通过递归地将数据集…

ui自动化中,隐式等待和显示等待什么时候使用

隐式等待 在页面刷新加载时&#xff0c;页面元素还没有出来&#xff0c;这个时候如果去找元素就会找不到报错 或者点了一个菜单&#xff0c;页面加载时 用笨办法&#xff0c;就是用sleep等待固定的时间&#xff0c;这种浪费的时间比较多&#xff0c;就可以用隐式等待&#xf…

cocos入门11:生命周期

Cocos Creator 是一个强大的游戏开发工具&#xff0c;它基于 JavaScript 或 TypeScript&#xff0c;并使用 cc.Class 系统来组织游戏逻辑。在 Cocos Creator 中&#xff0c;每个组件&#xff08;包括场景、节点和组件脚本&#xff09;都有其生命周期&#xff0c;这些生命周期函…

美业门店管理系统Java源码分享-【库存管理】的功能和作用

美业收银系统在美容行业中的作用和重要性体现在提高管理效率、提升客户满意度、降低成本、促进业务增长等方面。它为连锁美业提供了一个全面的管理工具&#xff0c;能够更好地应对市场挑战&#xff0c;提升竞争力。 美业系统中的【库存管理】在整个美容行业中起着非常重要的作…

深入理解ChatGPT工作原理

在人工智能领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术的飞速发展让机器能够更加自然和人类进行交流。OpenAI的ChatGPT作为当前最受关注的NLP模型之一&#xff0c;其出色的对话能力引起了业界和学术界的广泛关注。本文将深入探讨ChatGPT的工作原理&#xff0…

【SpringCloud学习笔记】RabbitMQ(中)

1. 交换机概述 前面《RabbitMQ上篇》我们使用SpringAMQP来演示如何用Java代码操作RabbitMQ&#xff0c;当时采用的是生产者直接将消息发布给队列&#xff0c;但是实际开发中不建议这么多&#xff0c;更加推荐生产者将消息发布到交换机(exchange)&#xff0c;然后由exchange路由…

Scala 入门指南:从零开始的大数据开发

为什么选择学习 Scala Scala 结合了面向对象编程和函数式编程的特性&#xff0c;使其既具有 Java 的稳健性&#xff0c;又具备 Haskell 的简洁和灵活性。Scala 兼容 Java&#xff0c;运行在 JVM 上&#xff0c;这意味着你可以无缝地使用 Java 库。此外&#xff0c;Scala 是 Ap…

护眼台灯攻略:护眼台灯真的有用吗?

当前&#xff0c;近视问题在人群中愈发普遍&#xff0c;据2024年的统计数据显示&#xff0c;我国儿童青少年的总体近视率已高达52.7%。近视的人越来越多&#xff0c;近视背后还潜藏着视网膜脱离、白内障、开角型青光眼等眼部疾病&#xff0c;严重的情况甚至可能引发失明。长时间…

C++关键字

C是一种强大的、面向对象的编程语言&#xff0c;它提供了一组关键字&#xff08;keywords&#xff09;用于定义语言的基本结构和功能。这些关键字是C语法中预先定义并保留的标识符&#xff0c;它们具有特定的含义&#xff0c;不能用作变量名、函数名或其他标识符。 以下是一些…

P3388 【模板】割点(割顶)

题目背景 割点 题目描述 给出一个 n 个点&#xff0c;m 条边的无向图&#xff0c;求图的割点。 输入格式 第一行输入两个正整数 n,m。 下面 m 行每行输入两个正整数 x,y 表示 x 到 y 有一条边。 输出格式 第一行输出割点个数。 第二行按照节点编号从小到大输出节点&am…

CNAS认证是什么?怎么做?

在全球化日益深入的今天&#xff0c;产品质量和安全已经成为企业生存和发展的重要基石。而在这个过程中&#xff0c;CNAS认证作为一种权威性的认可机制&#xff0c;发挥着不可替代的作用。那么&#xff0c;CNAS认证究竟是什么&#xff1f;我们又该如何进行这一认证过程呢&#…

van-list 遇到的问题

将公司项目H5页面重构的时候&#xff0c;有一个类似购物车的页面&#xff0c;需要上拉加载&#xff0c;下拉刷新。使用的UI组件的是vant&#xff0c;其中看起来van-list 很符合基本需求&#xff0c;就果断进行了copy 修改。但是&#xff0c;在进行具体的业务交互的时候突然发现…

有没有关于空三文件和空三定拍影像的相关资料呢。 新建空三影像显示坐标系与模型不一致如何解决?

答&#xff1a;可以检查一下空三xml文件&#xff0c;和模型的metedata文件的坐标系是否一样。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件&#xff0c;输入倾斜照片&#xff0c;激光点云&#xff0c;POS信息及像控点&#xff0c;输出高精度彩色网格…

【MySQL】表的基本增删查改(结合案例)

文章目录 1.前言2.插入数据&#xff08;Create&#xff09;2.1案例2.2单行数据全列插入2.3多行数据指定列插入2.4插入否则更新2.5替换 3. 读取数据(Retireve)3.1案例3.2全列查询3.3指定列查询3.4查询字段为表达式3.5为查询结果起别名3.6去重3.7where条件3.7.1案例 3.8排序3.9筛…