基于MariaDB4j实现持久层单元测试

该文章已同步至个人微信公众号[不能止步],欢迎关注。

1. MariaDB4j是什么

MariaDB4j的官网对MariaDB4j的定位为:

MariaDB4j is a Java (!) “launcher” for MariaDB (the “backward compatible, drop-in replacement of the MySQL® Database Server”, see FAQ and Wikipedia), allowing you to use MariaDB (MySQL®) from Java without ANY installation / external dependencies. Read again: You do NOT have to have MariaDB binaries installed on your system to use MariaDB4j!

翻译为中文为:
MariaDB4j是一个MariaDB(一个与MySQL兼容、可直接替换MySQL的数据库)的 Java 启动器,使得在Java应用中使用MariaDB时不需要任何安装或外部依赖。再次强调:使用MariaDB4j后,你不需要在你的系统上安装MariaDB!

可以看出MariaDB4j简化了对MariaDB的使用,其内部封装了MariaDB数据库的生命周期管理(包括下载、数据库的创建、删除等)。

2. 为什么选择MariaDB4j而非H2

从Google Trends看,目前使用最多的开源数据库依然为MySQL。
在这里插入图片描述

为了实现持久层的单元测试,开发通常使用H2数据库作为MySQL的测试替身,但是使用H2存在一个严重的问题:需要维护两套schema。如以下创建表的SQL:

CREATE TABLE IF NOT EXISTS t_task
(
    id               BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    service_name     VARCHAR(256) NOT NULL,
    code             VARCHAR(256),
    table_name       VARCHAR(256)
)ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin;

create unique index task_index_service_table_code
    on service_task (service_name, table_name, code);

因为H2不支持bigint unsigned类型、innodb引擎和索引,故需要为H2创建单独的schema,如下:

CREATE TABLE IF NOT EXISTS t_task
(
    id               int PRIMARY KEY AUTO_INCREMENT,
    service_name     text NOT NULL,
    code             text,
    table_name       text
);

3. 如何配置MariDB4j

MariDB4j的使用非常简单,以下基于Gradle进行说明。

步骤1:引入依赖包

testImplementation("ch.vorburger.mariaDB4j:mariaDB4j-springboot:2.4.0")
testImplementation("org.mariadb.jdbc:mariadb-java-client:2.5.3");

步骤2:配置MariaDB4j
在application-test.yaml中配置MariaDB4j:

# 配置Spring datasource
spring:
  datasource:
    url: jdbc:mariadb://localhost:3307/test
    username: root
    password:
    name: test
    driverClassName: or.mariadb.jdbc.Driver # mariadb的数据库驱动

mariaDB4j:
  port: 3307 #为了避免与本地安装的MySQL端口冲突,将MariaDB的端口设置为3307
  data: ./data #MariaDB的数据目录

步骤3:配置数据源
这里以手写数据源为例:

@Configuration
@Profile("test")
public class TestMariaDBConfig {
    @Bean
    public MariaDB4jSpringService mariaDB4jSpringService() {
        return new MariaDB4jSpringService();
    }

    @Bean
    public DataSource dataSource(MariaDB4jSpringService mariaDB4jSpringService,
        @Value("${spring.datasource.name}" String databaseName,
        @Value("${spring.datasource.username}" String userName,
        @Value("${spring.datasource.password}" String password,
        @Value("${spring.datasource.driverClassName}" String driver) {

        mariaDB4jSpringService.getDB().createDB(databaseName);
        DBConfigurationBuilder config = mariaDB4jSpringService.getConfiguration();
        DataSource dataSource = DataSourceBuilder.create()
            .username(userName)
            .password(password)
            .url(config.getURL(databaseName))
            .driverClassName(driver)
            .build();

        // 配置Flyway
        FluentConfiguration fluentConfiguration = new FluentConfiguration().dataSource(dataSource).locations("filesystem:src/main/resources/db/migration");
        Flyway flyway = new Flyway(fluentConfiguration);
        flyway.migrate(); #datasource初始化时会自动migration所有的schema
            
        return dataSource;
    }
}

4. 常见问题

  • 问题1:Linux下无法启动,提示信息如下"Please consult the Knowledge to find out how to urn mysqld as root"

请添加图片描述
解决方案:为MariaDB添加配置参数"–user=root"

@Bean
    public MariaDB4jSpringService mariaDB4jSpringService() {
        return new MariaDB4jSpringService() {
            @Override
            public DBConfigurationBuilder getConfiguration() {
                DBConfigurationBuilder builder = super.getConfiguration();
                /**
                 * Linux下必须以root用户启动
                 * builder调用build()方法后再次调用addArg方法时会抛出异常
                 */
                if (!builder._getArgs().contains("--user=root")) {
                    builder.addArg("--user=root");
                }
                return builder;
            }
        };
    }
  • 问题2:MariaDB无法启动、无法连接、无法删除等【大多数问题都属于这类】

    解决方案1:通过查看MariaDB的端口号,确认上一次启动的MariaDB进程是否关闭,若未关闭,则强制关闭,重新运行应用程序。

在这里插入图片描述
解决方案2:配置MariaDB使用随机端口号

mariaDB4j:
  port: 0 #配置MariaDB启动时选择未使用的随机端口

参考资料

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MariaDB4j 是一个 Java 库,可以帮助开发人员在应用程序中嵌入 MariaDB 数据库。以下是 MariaDB4j 的配置方法: 1. 添加依赖 您需要在项目的 pom.xml 文件中添加 MariaDB4j 的依赖。例如: ``` <dependency> <groupId>com.github.dieselpoint</groupId> <artifactId>mariadb4j</artifactId> <version>2.2.3</version> </dependency> ``` 2. 创建 MariaDB 数据库实例 在代码中创建 MariaDB 数据库实例,例如: ``` import ch.vorburger.mariadb4j.MariaDB4j; public class MyApp { public static void main(String[] args) throws Exception { MariaDB4j db = MariaDB4j.getInstance(); db.start(); } } ``` 3. 配置 MariaDB 数据库 您可以通过 MariaDBConfig 类配置 MariaDB 数据库。例如: ``` import ch.vorburger.mariadb4j.MariaDB4j; import ch.vorburger.mariadb4j.MariaDBConfig; public class MyApp { public static void main(String[] args) throws Exception { MariaDBConfig config = new MariaDBConfig(); config.setPort(3306); config.setDataDir("/path/to/data/dir"); config.setBaseDir("/path/to/base/dir"); config.setUserName("myuser"); config.setPassword("mypassword"); config.setCharset("utf8"); MariaDB4j db = new MariaDB4j(config); db.start(); } } ``` 4. 停止 MariaDB 数据库 在应用程序退出时,您需要停止 MariaDB 数据库。例如: ``` import ch.vorburger.mariadb4j.MariaDB4j; public class MyApp { public static void main(String[] args) throws Exception { MariaDB4j db = MariaDB4j.getInstance(); db.start(); // 运行应用程序 db.stop(); } } ``` 总之,MariaDB4j 配置简单,您只需添加依赖并创建 MariaDB 数据库实例即可。如果需要,您还可以配置 MariaDB 数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值