springboot3.x下集成hsqldb数据库

embedded/2025/3/6 5:42:12/

springboot3.x下集成hsqldb数据库

本文使用目前最新的sringboot3.4.3 和HyperSQL 2.7.4演示

HSQLDB数据库简介

HSQLDBHyperSQL DataBase)是一个开放源代码的JAVA数据库

可以透过 jdbc driver 来存取, 支持 ANSI-92 标准的 SQL 语法, 而且他占的空间很小, 拥有快速的数据库引擎, 可以自由下载, 并且可以安装使用在商业产品之上。

HSQLDB非常适合在用于快速的测试和演示的Java程序中。做单元测试也非常理想。

基本特性

开放源代码:HSQLDB可以自由使用和分发,源代码公开,方便开发者进行学习和修改。

JAVA接口:HSQLDB具有标准的SQL语法和JAVA接口,可以与JAVA应用程序无缝集成。

轻量级:HSQLDB占用的系统资源相对较少,适合在资源有限的环境中使用,如嵌入式系统或小型应用程序。

跨平台: HSQLDB是用Java编写的,因此具有Java的跨平台性质,可以在不同操作系统上运行。

运行模式

HSQLDB支持多种运行模式,以满足不同场景下的需求:

Server模式:在这种模式下,HSQLDB作为一个独立的数据库服务器运行,可以通过网络接受客户端的连接请求。多个客户端可以同时连接到服务器并执行数据库操作。Server模式提供了最大的可访问性。

In-Process模式(又称Standalone模式):HSQLDB可以作为一个库嵌入到Java应用程序中,与应用程序在同一个JVM进程中运行。这种模式因为数据不用转换和通过网络传送,所以速度更快。但其主要的缺点是默认的不能从应用程序外连接到数据库

内存模式:数据库完全存储在内存中,适合临时存储和测试。因为数据不会持久化到磁盘,所以当数据库关闭时,所有数据将丢失。内存模式通过“mem:”协议的方式来指定。

Web服务器模式:此模式以WEB服务器的形式启动,并通过HTTP协议接受客户端命令。

hsqldb数据库安装

下载地址

https://sourceforge.net/projects/hsqldb/files/hsqldb/

本文使用的版本HyperSQL 2.7.4

解压ZIP包

将下载的ZIP包解压到目标文件夹中。

启动HyperSQL服务器

进入data文件夹,输入下面的命令:

java -cp ../lib/hsqldb.jar org.hsqldb.server.Server --database.0 file:d:/temp/mydb --dbname.0 test

说明

java: 这是 Java 应用程序的启动命令。

-cp ../lib/hsqldb.jar: -cp 参数指定了类路径(classpath),即 Java 运行时环境搜索类文件的位置。它指向了包含 HyperSQL JDBC 驱动和服务器类的 JAR 文件 hsqldb.jar。

org.hsqldb.server.Server: 这是要运行的HyperSQL数据库服务器入口点类的完全限定名。

--database.0 file:d:/temp/mydb: 这是一个服务器参数,指定了第一个数据库的位置和类型。--database.0 表示这是第一个(也可能是唯一的)数据库实例的配置。file:d:/temp/mydb 指定了数据库文件的存储位置,D:\temp\ 目录下的名为 mydb 的文件数据库。这里的 file: 前缀是必需的,告诉 HyperSQL 数据库是以文件形式存储的。

--dbname.0 test: 这是另一个服务器参数,为第一个数据库实例指定了一个数据库名(或别名)。这里数据库名被设置为test。这个名称将在客户端连接数据库时使用。

当你运行这个命令时,HyperSQL 服务器将启动,并在指定的位置(d:/temp/mydb)创建一个新的数据库(如果它还不存在的话),或者打开一个已经存在的数据库。服务器将监听默认的端口(通常是 9001),等待客户端连接。

客户端可以使用 JDBC URL jdbc:hsqldb:hsql://localhost/test 来连接到这个数据库,其中 localhost 是服务器的地址,test 是你在 --dbname.0 参数中指定的数据库名。

打开 HSQLDB 客户端

进入data文件夹,输入下面的命令:

java -classpath ../lib/hsqldb.jar org.hsqldb.util.DatabaseManagerSwing

在客户端界面中,填写必要的连接参数,如:

Type:选择 HSQL Database Engine Server(如果你连接的是服务器模式)。

Driver:通常不需要修改,默认为 org.hsqldb.jdbcDriver。

URL:输入 JDBC 连接字符串,如 jdbc:hsqldb:hsql://localhost/mydb(其中 localhost 是服务器地址,mydb 是你在启动服务器时指定的数据库名)。

User 和 Password:输入你在启动服务器时设置的用户名和密码(如果有的话)。

点击连接按钮来连接到数据库

创建bat文件

也可以通过批处理文件启动服务器和打开客户端

在hsqldb的文件夹中创建一个mydb文件夹,在文件夹中创建批处理文件:runManager.bat,runManagerSwing.bat

runManager.bat的内容:

@echo off

java -cp ../lib/hsqldb.jar org.hsqldb.server.Server --database.0 file:d:/temp/mydb --dbname.0 test

runManagerSwing.bat的内容:

@echo off

java -classpath ../lib/hsqldb.jar org.hsqldb.util.DatabaseManagerSwing

springboot集成

HSQLDB是一个纯Java的关系数据库管理系统(RDBMS),它非常适合用于开发和测试环境。以下是在Spring Boot中集成HSQLDB的基本步骤:

添加依赖

添加HSQLDB的依赖以及Spring Boot Starter JDBC(或JPA,如果你打算使用JPA)。

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-jdbc</artifactId>

</dependency>

<dependency>

    <groupId>org.hsqldb</groupId>

    <artifactId>hsqldb</artifactId>

    <version>2.7.4</version>

</dependency>

配置数据源

在application.yml文件中配置HSQLDB数据源。

spring:

  datasource:

    url: jdbc:hsqldb:mem:testdb

    driver-class-name: org.hsqldb.jdbcDriver

    username: sa

password:

spring.datasource.url指定HSQLDB的内存数据库URL(mem:testdb表示在内存中创建名为testdb的数据库)。也可以将数据库URL更改为文件模式(如jdbc:hsqldb:file:/path/to/your/db),以便将数据库存储在磁盘上。

spring.datasource.driverClassName指定HSQLDB的JDBC驱动类名。

spring.datasource.usernamespring.datasource.password指定数据库的用户名和密码(默认用户名是sa,密码为空)。

Student实体类

@Data

@AllArgsConstructor

@NoArgsConstructor

@Builder

public class Student {

    private Integer age;

    private String name;

    private long id;

}

数据层接口

public interface StudentDao {

    // 创建数据表

    int createTable();

    //插入记录

    int insetStudent(String name, int age);

    //查询所有的记录

    List<Student> queryStudents();

    //根据id查询对应的记录

    Student queryStudentById(int id);

    //更新的操作

    int updateStudent(int id, int age);

    //删除指定记录

    int deleteStudent(int id);

}

字段映射类

//实现 查询记录中字段和实体类属性的映射

public class StudentRowMapper implements RowMapper<Student> {

    @Override

    public Student mapRow(ResultSet resultSet, int i) throws SQLException {

        Student student = new Student();

        student.setId(resultSet.getInt("id"));

        student.setName(resultSet.getString("name"));

        student.setAge(resultSet.getInt("age"));

        return student;

    }

}

数据层实现类

@Component

public class StudentDaoImpl implements StudentDao {

    @Autowired

    private JdbcTemplate jdbcTemplate;

    @Override

    public int createTable() {

        String sql = "CREATE TABLE student (" +

                "id BIGINT GENERATED BY DEFAULT AS IDENTITY(START WITH 1) PRIMARY KEY, " +

                "name VARCHAR(255) NOT NULL, " +

                "age INTEGER DEFAULT 0)";

        jdbcTemplate.execute(sql);

        return 0;

    }

    @Override

    public int insetStudent(String name, int age) {

        String sql = "insert into student(name,age) values(?,?)";

        int n = jdbcTemplate.update(sql,name,age);

        return n;

    }

    @Override

    public Student queryStudentById(int id) {

        String sql = "select * from student where id=?";

        Student student = jdbcTemplate.queryForObject(sql,new StudentRowMapper(),new Object[]{id});

        return student;

    }

    @Override

    public List<Student> queryStudents() {

        String sql = "select * from student";

        List<Student>studentList = jdbcTemplate.query(sql,new StudentRowMapper());

        return studentList;

    }

    @Override

    public int updateStudent(int id, int age) {

        String sql = "update student set age=? where id=?";

        return jdbcTemplate.update(sql,age,id);

    }

    @Override

    public int deleteStudent(int id) {

        String sql = "delete from student where id=?";

        return jdbcTemplate.update(sql,id);

    }

}

测试

    @Test

    public void queryStudentsTest() {

        // 创建数据表

        studentDao.createTable();

        // 插入记录

        int n = studentDao.insetStudent("name1",12);

        n = studentDao.insetStudent("name2",12);

        System.out.println("n:" + n);

        // 查询所有记录

        List<Student> stuList = studentDao.queryStudents();

        System.out.println("size:" + stuList.size());

        // 修改年龄

        n = studentDao.updateStudent(1,10);

        Student stu = studentDao.queryStudentById(1);

        System.out.println("student id:" + stu.getId() + ",name:" + stu.getName() +",age:" + stu.getAge());

        // 删除记录

        n = studentDao.deleteStudent(2);

        System.out.println("n:" + n);

    }

常见问题

问题1主键id的值从0开始而不是1:

HSQLDB的自增列通常使用GENERATED BY DEFAULT AS IDENTITY,在创建表时需要明确指定起始值。例如:

CREATE TABLE table_name (id INT GENERATED BY DEFAULT AS IDENTITY (START WITH 1), ...);

这样在新建表时,主键就会从1开始。如果用户没有指定START WITH,HSQLDB默认从0开始,这可能是问题所在。

问题2希望在磁盘上创建数据库

HSQLdb2.7.4数据库在springboot中配置为文件模式,url为jdbc:hsqldb:file:d:/temp/mydb

问题3HSQLDB遇到数据库锁的问题

报错: java.sql.SQLException: Database lock acquisition failure: lockFile: org.hsqldb.persist.LockFile@3ad4f283[file =D:\Temp\mydb.lck, exists=true, locked=false, valid=false, ] method: checkHeartbeat read: 2025-03-03 07:32:10 heartbeat - read: -5476 ms.

HSQLDB的几种模式:内存模式、文件模式、Web服务器模式和HSQL服务器模式。内存模式和文件模式不需要独立服务器,而Web和HSQL服务器模式需要。

把单独启动的服务器关掉


http://www.ppmy.cn/embedded/170407.html

相关文章

Anolis服务器Arm64架构服务器配置(其他版本服务器解决方式思路一质)

Anolis服务器Arm64架构服务器配置 1.nginx配置1.1.尝试安装nginx1.2.资源准备1.2.1.查看服务器系统版本:1.2.2.下载依赖包:1.3.正式安装nginx1.3.1.下载nginx并上传服务器1.3.2.开始安装nginx1.4.防火墙配置1.4.1.直接关闭防火墙:不推荐,但省事1.4.2.命令介绍1.4.3.配置开启…

Guava Cache 中LocalCache的分段锁实现

以下是 Guava Cache 中 LocalCache 分段锁实现的核心流程图&#xff0c;使用 Mermaid 语法绘制。该流程图展示了 Segment 的初始化、缓存操作&#xff08;获取和写入&#xff09; 以及 并发控制机制。 #mermaid-svg-gYQ5DSpnmX1XYKdh {font-family:"trebuchet ms",ve…

利用DeepSeek-Kimi打通Excel与PPT的链条,自动生成数据分析报告

通过DeepSeek在Excel生成结构化的数据分析报告&#xff0c;再借助Kimi的PPT助手将报告自动转换为专业的PPT演示文稿&#xff0c;从而实现从数据到展示的一站式解决方案。 案例数据 1.一键生成数据分析报告 在下载并安装“Excel矩阵”后&#xff0c;我们启用DeepSeek的右侧对话…

直播流程管理 AI 应用的开发思路和功能实现

以下是一个直播流程管理 AI 应用的开发思路和功能实现的大致框架&#xff1a; 技术栈选择 后端&#xff1a;可以选择 Python&#xff08;Django 或 Flask 框架&#xff09;&#xff0c;因为 Python 有丰富的库可以处理各种任务&#xff0c;如数据库操作、邮件发送等。也可以选择…

任务9:交换机基础及配置

CSDN 原创主页&#xff1a;不羁https://blog.csdn.net/2303_76492156?typeblog 一、交换机基础 交换机的概念&#xff1a;交换机是一种网络设备&#xff0c;用于连接多台计算机或网络设备&#xff0c;实现数据包在局域网内的快速交换。交换机基于MAC地址来转发数据包&#x…

wifi5和wifi6,WiFi 2.4G、5G,五类网线和六类网线,4G和5G的区别

wifi5和wifi6的区别 是Wi-Fi 5和Wi-Fi 6的选择与路由器密切相关。路由器是创建和管理无线网络的设备,它决定了网络的类型和性能。具体来说: 路由器的标准支持:路由器可以支持不同的Wi-Fi标准,如Wi-Fi 5(802.11ac)和Wi-Fi 6(802.11ax)。支持Wi-Fi 6的路由器能够提供更高…

解决 Excel 模板填充痛点:开发一款高效实用的工具

在项目开发中&#xff0c;Excel 模板在数据导出过程中扮演着重要角色。然而&#xff0c;在使用现有开源 Excel 处理工具的过程中&#xff0c;我们团队遇到了一些挑战&#xff0c;例如&#xff1a; 性能问题&#xff1a; 处理大规模 Excel 文件时速度较慢&#xff0c;影响业务效…

飞书考勤Excel导入到自己系统

此篇主要用于记录Excel一行中&#xff0c;单条数据的日期拿取&#xff0c;并判断上下班打卡情况。代码可能满足不了大部分需求&#xff0c;目前只够本公司用&#xff0c;如果需要&#xff0c;可以参考。 需要把飞书月度汇总的考勤表导入系统中可以参考下。 下图为需要获取的年…