跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Spring 嵌入式内存数据库配置与使用实战

Spring 框架支持 HSQL、H2 和 Derby 三种嵌入式内存数据库,配置简单且无需管理驱动类与连接 URL,非常适合单元测试场景。通过 <jdbc:embedded-database> 标签结合 schema.sql 和 test-data.sql 脚本,可快速初始化表结构与测试数据。相比传统 DataSource 配置,这种方式显著降低了测试环境的搭建成本,让开发者更专注于业务逻辑验证。

指针猎手发布于 2025/1/20更新于 2026/10/775 浏览
Spring 嵌入式内存数据库配置与使用实战

在开发过程中,尤其是进行单元测试时,内存数据库(Embedded Database)因其配置简单、启动速度快且易于测试而备受青睐。Spring 框架原生支持 HSQL、H2 和 Derby 三种内存数据库,通过 <jdbc:embedded-database> 标签即可快速集成,无需繁琐的驱动类与 URL 配置。

基础配置

首先需要在 applicationContext.xml 中引入 JDBC 命名空间,并添加嵌入式数据库配置。这里默认使用 HSQL 数据库,如果需要使用其他类型,只需修改 type 属性即可。

<jdbc:embedded-database id="dataSource">
    <jdbc:script location="classpath:schema.sql"/>
    <jdbc:script location="classpath:test-data.sql"/>
</jdbc:embedded-database>

注意:

  • 确保已正确声明 jdbc 命名空间。
  • schema.sql 用于创建表结构和约束条件。
  • test-data.sql 用于插入初始测试数据。

有了该内存数据库配置后,传统的 driverClassName、url、username 等连接池配置就不再需要了。

示例:Derby 数据库集成

下面我们通过一个 Derby 数据库的示例来具体看看。相比传统方式,我们不再需要手动配置 DriverManagerDataSource,而是直接利用 Spring 的嵌入式功能。

Spring 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd
           http://www.springframework.org/schema/jdbc
           http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    <!-- 使用内存数据库 -->
    <jdbc:embedded-database id="dataSource" type="DERBY">
        <jdbc:script location="classpath:schema.sql"/>
        <jdbc:script location="classpath:test-data.sql"/>
    </jdbc:embedded-database>

    <bean id="sessionFactory"
          class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource">
            <ref bean="dataSource"/>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.DerbyDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
            </props>
        </property>
        <property name="annotatedClasses">
            <list>
                <value>zwh.spring.security.po.User</value>
                <value>zwh.spring.security.po.Role</value>
            </list>
        </property>
    </bean>

    <!-- 使用 annotation 的方式配置 Spring Bean -->
    <context:component-scan base-package="zwh.spring.security"></context:component-scan>
</beans>
数据库脚本

schema.sql - 定义表结构与外键约束

CREATE TABLE sec_user (
    username VARCHAR(100) PRIMARY KEY,
    password VARCHAR(255)
);

CREATE TABLE sec_role (
    rolename VARCHAR(100) PRIMARY KEY,
    prompt VARCHAR(255)
);

CREATE TABLE sec_role_user (
    username VARCHAR(100) NOT NULL,
    rolename VARCHAR(100) NOT NULL,
    CONSTRAINT ru_id PRIMARY KEY (username, rolename)
);

ALTER TABLE sec_role_user ADD CONSTRAINT fk_user FOREIGN KEY (username) REFERENCES sec_user(username);
ALTER TABLE sec_role_user ADD CONSTRAINT fk_role FOREIGN KEY (rolename) REFERENCES sec_role(rolename);

test-data.sql - 插入测试数据

INSERT INTO sec_user VALUES ('admin', 'admin');
INSERT INTO sec_user VALUES ('test', 'test');
INSERT INTO sec_role VALUES ('ROLE_USER', 'common user privilege');
INSERT INTO sec_role VALUES ('ROLE_ADMIN', 'administrator privilege');
INSERT INTO sec_role_user VALUES ('test', 'ROLE_USER');
INSERT INTO sec_role_user VALUES ('admin', 'ROLE_USER');
INSERT INTO sec_role_user VALUES ('admin', 'ROLE_ADMIN');

总结

这种配置方式极大地简化了测试环境的搭建。在实际运行中,每次测试启动都会重新初始化内存数据库,确保环境干净且一致。对于不需要持久化数据的场景,这比维护真实的数据库实例要高效得多。

目录

  1. 基础配置
  2. 示例:Derby 数据库集成
  3. Spring 配置文件
  4. 数据库脚本
  5. 总结

更多推荐文章

查看全部
  • 如何利用 AI 大模型解决实际问题:实战案例与操作指南
  • DeepSeek-R1 通过知识蒸馏将推理能力迁移至 Qwen 系列模型
  • LLaMA Factory 大模型训练与微调指南
  • 前端 WebSocket 实时通信实战:从原理到生产级封装
  • OpenClaw v2026.3.8 全平台部署与本地模型对接指南
  • 常用 C/C++ 编译器盘点:Clang、MSVC、ICC 及嵌入式方案
  • Python 列表核心知识点详解
  • Python 单元测试框架实战:基于 unittest 的代码质量自动化测试
  • 开源数字图书馆构建指南:Open Library 架构与部署
  • Mac mini 静音低功耗配置:OpenClaw 卧室运行指南
  • 基于Llama-Factory/Qwen2.5-1.5b自定义数据集LoRA微调实战【PPO/RLHF/训练/评估】
  • 利用 AI 工具擦除视频中的动态人物和文字
  • C++ STL 容器适配器详解:Stack、Queue 与 Priority Queue 的本质与实现
  • 前端无法获取响应头(如 Content-Disposition)的原因与解决方案
  • MCAP 机器人数据容器全面实践指南
  • 基于 AI 辅助快速构建 CRM 系统原型的技术实践
  • MATLAB 多模型 AI 工具箱:支持 DeepSeek/Kimi/GPT 等接入与代码生成
  • SAP 调用外部 Web Service 完整流程指南
  • Buzz 离线语音转文字工具安装与使用指南
  • Win10 禁用 Microsoft 365 Copilot 弹窗的 6 种方案

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online