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),无需完整安装即可运行数据库。
使用步骤:
- 下载 uber JAR 文件
mariaDB4j-app.jar
(可在 Maven Central 获取,当前最新版本为 3.1.0) - 执行 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 交互(完整数据库引擎支持标准连接):
- 创建带凭据的数据库:
db.createDB("testing", "testuser", "testpass");
- 获取连接字符串:
String url = db.getConfiguration().getURL("testing"); // 输出: jdbc:mariadb://localhost:13306/testing
- 使用标准 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 获取。