1. 介绍

MariaDB 是 MySQL 的替代数据库引擎,由 MySQL 原班人马开发,可作为 MySQL 的直接替代品。本文将探讨 MariaDB4j 库,它允许我们在 Java 应用中将 MariaDB 当作嵌入式数据库使用。

2. 工作原理

MariaDB4j 通过打包预编译的 MariaDB 数据库引擎原生版本实现功能。它依赖多个组件实现:

  • 核心功能位于 ch.vorburger.mariaDB4j:mariaDB4j-core 工件
  • 额外工件包含可直接使用的 MariaDB 数据库引擎副本
  • 支持 Windows、Linux 和 macOS 平台

使用时,MariaDB4j 会自动检测当前操作系统,将数据库引擎解压到临时工作目录并执行。启动后,我们可以像连接独立数据库一样操作它。该库负责数据库的解压、配置、启动和停止。

这是 Testcontainers 等方案的替代方案(Testcontainers 通过 Docker 容器运行数据库)。这意味着即使在没有 Docker 或不适合使用 Docker 的环境中,我们也能使用该数据库。

3. 命令行使用

MariaDB4j 首先支持命令行封装方式(仅限 Windows 和 Linux),无需完整安装即可运行数据库。

使用步骤:

  1. 下载 uber JAR 文件 mariaDB4j-app.jar(可在 Maven Central 获取,当前最新版本为 3.1.0
  2. 执行 JAR 文件:
$ java -jar mariaDB4j-app-3.1.0.jar
.....
2024-11-08T07:38:47.867Z  INFO 40 --- [pool-9-thread-2] ch.vorburger.exec.ManagedProcess         : mariadbd: 2024-11-08  7:38:47 0 [Note] /tmp/MariaDB4j/base/bin/mariadbd: ready for connections.
2024-11-08T07:38:47.868Z  INFO 40 --- [pool-9-thread-2] ch.vorburger.exec.ManagedProcess         : mariadbd: Version: '10.11.5-MariaDB'  socket: '/tmp/MariaDB4j.3307.sock'  port: 3307  MariaDB Server
2024-11-08T07:38:47.924Z  INFO 40 --- [           main] ch.vorburger.mariadb4j.DB                : Database startup complete.
2024-11-08T07:38:48.454Z  INFO 40 --- [           main] c.v.m.s.boot.MariaDB4jApplication        : Started MariaDB4jApplication in 6.589 seconds (process running for 8.281)

Hit Enter to quit...

启动完成后数据库即可使用。可通过系统属性自定义配置:

  • mariaDB4j.port:监听端口
  • mariaDB4j.baseDir:解压目录
  • mariaDB4j.dataDir:数据文件目录
$ java -DmariaDB4j.port=13306 -DmariaDB4j.baseDir=/tmp/db -DmariaDB4j.dataDir=/tmp/data -jar mariaDB4j-app-3.1.0.jar

4. 在 Java 中使用

更常见的需求是在应用中自动运行 MariaDB。首先添加依赖(Maven 配置):

<dependency>
    <groupId>ch.vorburger.mariaDB4j</groupId>
    <artifactId>mariaDB4j</artifactId>
    <version>3.1.0</version>
</dependency>

默认包含 Windows 和 Linux 支持(MariaDB 10.11.5)。macOS 需额外添加依赖,但暂不支持最新版本。

基础使用方式:

DB db = DB.newEmbeddedDB(0); // 0 表示自动分配端口
try {
    db.start();
} finally {
    db.stop();
}

此时数据库已启动并可用

4.1. 数据库配置

可通过 DBConfigurationBuilder 自定义配置

DBConfigurationBuilder config = DBConfigurationBuilder.newBuilder();
config.setPort(13306);          // 端口
config.setDataDir("/tmp/data"); // 数据目录
config.setBaseDir("/tmp/db");   // 基础目录

DB db = DB.newEmbeddedDB(config.build());

创建后使用方式不变。还可通过 setDatabaseVersion() 指定版本,但需确保包含对应依赖。

4.2. 数据库交互

MariaDB4j 提供多种交互方式

✅ 直接执行命令

db.run("show databases");

输出将打印到 Java 标准输出(无返回值):

[2024-11-08 09:37:40,470]-[main] INFO  ch.vorburger.mariadb4j.DB - Running a command: show databases
[2024-11-08 09:37:40,470]-[main] INFO  ch.vorburger.exec.ManagedProcess - Starting Program [/tmp/MariaDB4j/base/bin/mariadb, --default-character-set=utf8, --socket=/tmp/MariaDB4j.40315.sock] (in working directory /tmp/MariaDB4j/base)
[2024-11-08 09:37:40,535]-[CommonsExecStreamPumper-pool-17-thread-2] INFO  ch.vorburger.exec.ManagedProcess - mariadb: Database
[2024-11-08 09:37:40,536]-[CommonsExecStreamPumper-pool-17-thread-2] INFO  ch.vorburger.exec.ManagedProcess - mariadb: information_schema
[2024-11-08 09:37:40,536]-[CommonsExecStreamPumper-pool-17-thread-2] INFO  ch.vorburger.exec.ManagedProcess - mariadb: mysql
[2024-11-08 09:37:40,536]-[CommonsExecStreamPumper-pool-17-thread-2] INFO  ch.vorburger.exec.ManagedProcess - mariadb: performance_schema
[2024-11-08 09:37:40,536]-[CommonsExecStreamPumper-pool-17-thread-2] INFO  ch.vorburger.exec.ManagedProcess - mariadb: sys
[2024-11-08 09:37:40,536]-[CommonsExecStreamPumper-pool-17-thread-2] INFO  ch.vorburger.exec.ManagedProcess - mariadb: test
[2024-11-08 09:37:40,536]-[CommonsExecStreamPumper-pool-17-thread-2] INFO  ch.vorburger.exec.ManagedProcess - mariadb: testing
[2024-11-08 09:37:40,538]-[CommonsExecStreamPumper-pool-17-thread-2] INFO  ch.vorburger.exec.ManagedProcess - mariadb: Exit status 0

✅ 便捷方法

  • 创建数据库(封装 CREATE DATABASE IF NOT EXISTS):
    db.createDB("testing", "testuser", "testpass");
    
  • 执行类路径 SQL 脚本:
    db.createDB("testing", "testuser", "testpass");
    db.source("com/baeldung/data/mariadb4j/source.sql", "testuser", "testpass", "testing");
    

4.3. JDBC 交互

最实用的方式是通过 JDBC 交互(完整数据库引擎支持标准连接):

  1. 创建带凭据的数据库:
    db.createDB("testing", "testuser", "testpass");
    
  2. 获取连接字符串:
    String url = db.getConfiguration().getURL("testing");
    // 输出: jdbc:mariadb://localhost:13306/testing
    
  3. 使用标准 JDBC 操作:
    try (Connection conn = DriverManager.getConnection(url, "testuser", "testpass")) {
     // JDBC 操作代码
    }
    

⚠️ 注意:需确保类路径包含 MariaDB JDBC 驱动。同样适用于 JPA、JdbcTemplate 等工具。

5. 在 JUnit 测试中使用

MariaDB4j 非常适合测试场景:测试用临时数据库,生产环境用持久数据库。提供 JUnit4 规则

✅ 方法级规则(每个测试重启)

@Rule
public MariaDB4jRule dbRule = new MariaDB4jRule(0);

@Test
public void whenRunningATest_thenTheDbIsAvailable() throws Exception {
    try (Connection conn = DriverManager.getConnection(dbRule.getURL(), "root", "")) {
        // JDBC 操作
    }
}

✅ 类级规则(整个测试类共享)

@ClassRule
public static MariaDB4jRule dbRule = new MariaDB4jRule(0);
方式 优点 缺点
@Rule 测试隔离性好 性能开销大
@ClassRule 性能更优 可能存在测试间数据污染

6. 总结

本文快速介绍了 MariaDB4j 的核心用法,展示了多种启动 MariaDB 的方式。该库还支持 Maven 集成和 Spring Boot 等高级功能。所有示例代码可在 GitHub 获取。


原始标题:Embedded MariaDB Using MariaDB4j | Baeldung