springboot3.x下集成hsqldb数据库
本文使用目前最新的sringboot3.4.3 和HyperSQL 2.7.4演示
HSQLDB数据库简介
HSQLDB(HyperSQL 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.username和spring.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
问题3:HSQLDB遇到数据库锁的问题
报错: 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服务器模式需要。
把单独启动的服务器关掉