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_codeon 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/testusername: rootpassword:name: testdriverClassName: or.mariadb.jdbc.Driver # mariadb的数据库驱动mariaDB4j:port: 3307 #为了避免与本地安装的MySQL端口冲突,将MariaDB的端口设置为3307data: ./data #MariaDB的数据目录

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

@Configuration
@Profile("test")
public class TestMariaDBConfig {@Beanpublic MariaDB4jSpringService mariaDB4jSpringService() {return new MariaDB4jSpringService();}@Beanpublic 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();// 配置FlywayFluentConfiguration fluentConfiguration = new FluentConfiguration().dataSource(dataSource).locations("filesystem:src/main/resources/db/migration");Flyway flyway = new Flyway(fluentConfiguration);flyway.migrate(); #datasource初始化时会自动migration所有的schemareturn dataSource;}
}

4. 常见问题

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


解决方案:为MariaDB添加配置参数"–user=root"

@Beanpublic MariaDB4jSpringService mariaDB4jSpringService() {return new MariaDB4jSpringService() {@Overridepublic 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启动时选择未使用的随机端口

参考资料

  • MariaDB4j

基于MariaDB4j实现持久层单元测试相关推荐

  1. 基于 mockMvc 的 Controller 层单元测试

    场景 单元测试是个让人很纠结的东东,dealline 催的很紧,不想写单测,但当项目复杂到一定程度需要重构时,返现没有单测,不敢随便改代码,生怕"敲一锤子,倒一大片",但此时再补, ...

  2. 优秀的持久层框架-Mybatis(上)

    文章目录 前言 一.MyBatis概述 1.1传统JDBC编程 1.2 mybatis的历史 1.3 mybatis是什么? 1.4如何使用? 1.5Mybatis架构 二. MyBatis环境搭建 ...

  3. Java数据持久层框架 MyBatis之背景知识一

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  4. mysql高可用 持久层_MyBatis持久层框架使用总结 转载

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 2 ...

  5. Java软件开发:自定义MyBatis持久层框架

    自定义MyBatis持久层框架 1 框架概述 1.1 什么是框架 1.2 框架要解决的问题 1.3 软件开发的分层的重要性 2 MyBatis框架 3 JDBC编程 3.1 JDBC程序的回顾 3.2 ...

  6. MyBatis 一个数据持久层(ORM)框架

    MyBatis 的前身就是 iBatis .是一个数据持久层(ORM)框架. MyBatis框架 [1] iBATIS一词来源于"internet"和"abatis&qu ...

  7. MyBatis 数据持久层

    引用:http://baike.baidu.com/view/4372646.htm MyBatis 的前身就是 iBatis .是一个数据持久层(ORM)框架. MyBatis框架 [1] iBAT ...

  8. java持久层用文件_Java持久层框架MyBatis简单实例

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .本文 ...

  9. Mosquitto持久层群推消息实现思路

    http://www.jouhu.com/blog/?p=2632 1 前言 最近在考虑Android平台下基于Mosquitto实现持久层的群消息推送的问题,在这里整理一下思路.以为实现做准备. 2 ...

最新文章

  1. mvc调用mysql存储过程_使用.NET MVC +EF调用oracle的存储过程
  2. 安卓学习 intent
  3. linux 下使用genymotion
  4. MVC中Controller弹出提示框
  5. 在页面中给flash加链接
  6. html分页 css,js+css实现的简单易用兼容好的分页
  7. GitHub 2200+星的任正非语录下架了,我们找到了一份fork版
  8. 继续跟上--“永远不要对一个外行聊你的专业”
  9. 【问题记录】python 函数 传入一个对象返回一个对象值得注意
  10. opengl初学 error C2664: 无法将参数 1 从“const char [7]”转换为“LPCWSTR”
  11. 1995-2013年RSA大会历届主题回顾
  12. AS SSD软件查看信息说明
  13. 大一 C语言课程设计
  14. Zigbee,esp8266(wifi),蓝牙协议三种通信方式
  15. 国家基金申请书撰写的共性问题(转)
  16. (十六)从零开始学人工智能-深度学习基础3
  17. ffmpeg mp4 mp3 wav flac webm aac ac3 ogg格式转换
  18. Python 中File(文件) 方法?
  19. 2066: 计算鸡的蛋II
  20. 基于物联网的智能家居系统设计QY-LYZN

热门文章

  1. JDK的下载安装(含安装文件)
  2. # Itext Pdf 5 教程
  3. 多个相机拍摄定位_多相机视觉系统的坐标系统标定与统一及其应用
  4. C++ 时间计算器 之 超级无敌小白版 刚入门的快点看过来!
  5. c语言直接实现bzip2压缩方法,Linux普通文件压缩工具gzip、Bzip2、xz
  6. 立式大钢琴-Native Instruments The Giant v1.2.0 Kontakt
  7. RFID系统 免费开源代码 开发,分享[申明:来源于网络]
  8. 【清风数模】 相关系数(理论知识+代码实操 保姆级笔记)
  9. 搭建微服务架构的电商平台系统
  10. 汉泰示波器软件|汉泰示波器上位机软件NS-Scope,任意添加测量数据