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

springboot3.x下集成hsqldb数据库

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.kler.cn/a/573688.html

相关文章:

  • wxWidgets GUI 跨平台 入门学习笔记
  • 问题描述:如何将ts文件转换mp4文件
  • 人工智能】数据挖掘与应用题库(401-500)
  • todo: 使用融云imserve做登录(android)
  • xshell中bashdb 调试器的详细使用方法
  • 【全栈开发】---- 一文掌握 Websocket 原理,并用 Django 框架实现
  • 飞机大战lua迷你世界脚本
  • 软件工程与实践(第4版 新形态) 练习与实践1
  • kettle插件-高性能插入更新插件Upsert
  • ZT26 小球投盒
  • 网络安全需要掌握哪些技能?
  • 解决java-jar报错:xxx.jar 中没有主清单属性的方法
  • Linux断电重启后,硬盘挂载失败问题。
  • 解决新建小程序页面文字顶在顶部问题
  • Android开发Android调web的方法
  • 获取Kernel32基地址
  • Docker小游戏 | 使用Docker部署DOS游戏合集
  • SQL命令详解之常用函数
  • 虚拟网络IP设置
  • Python 面向对象编程-继承与多态