Java,MySQL:有没有一种方法可以将MySQL服务器嵌入到Java程序中?

22

我喜欢.NET的一点是它可以让数据库文件和项目在一起。我知道使用SQLite数据库可以实现这一点,但是有人能用MySQL数据库后端来实现吗?

例如,如果我运行一个Java程序,它应该能够启动自己的小型MySQL服务器并操作数据。因此,本质上,我希望能够像使用SQLite一样流畅地使用MySQL的强大功能。


1
Apache Derby(JavaDB)非常容易嵌入到Java应用程序中,并且它的工作效果相当不错。 - ChadNC
1
谢谢,我会研究一下。我有很多与MySQL配合使用的脚本。您是否知道将JavaDB转换为MySQL数据库是否容易? - Legend
1
HSQLDB 也很容易,但问题是关于 MySQL :) - Bozho
1
不要忘记伟大的H2数据库! - marcolopes
现在的2018年有一些完美的选择。请查看我的答案以获取更多相关信息。 - Simon Baars
4个回答

23
如果您不介意使用MariaDB(MySQL的开源变体,基本上是相同的),MariaDB4j可以是生产环境的完美选择。
MariaDB4j是MariaDB(MySQL的向后兼容、可插拔替换的数据库服务器)的Java(!)“启动器”,允许您在没有任何安装/外部依赖的情况下从Java中使用MariaDB(MySQL(R))。再次阅读:您不需要在系统上安装MariaDB二进制文件即可使用MariaDB4j!
由于它完全不需要用户PC上必须具备的任何要求,因此将MySQL嵌入项目可能是最佳选择。将不使用嵌入式数据库的项目转换为MariaDB4j就像调用一样简单:
DB db = DB.newEmbeddedDB(3306);

请阅读GitHub页面获取更多信息。Maven中央库的依赖是:

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

你可以将此与最新的驱动程序结合使用,以获取对MySQL 8.0所有功能的访问(win64/win32=Windows,mac64=macOS,linux64=Linux):
<dependency>
  <groupId>org.craftercms.mariaDB4j</groupId>
  <artifactId>mariaDB4j-db-win64</artifactId>
  <version>10.4.6.2</version>
</dependency>

如果您不想使用MariaDB,另一个选择是Wix Embedded MySQLWix Embedded MySQL是一个库,提供了一种在集成测试中运行真实MySql的方式。
为什么要这样做呢?
  • 您的测试可以在类似生产环境的环境下运行:匹配版本、编码、时区、数据库/架构/用户设置;
  • 它很容易使用,比手动安装正确版本要容易得多;
  • 您可以在没有任何本地设置的情况下为每个项目使用不同的版本/配置;
  • 支持多个平台:Windows、Linux和OSX;
  • 提供不断更新的多个MySql版本-5.5、5.6、5.7、8.0;
  • 支持所有支持的操作系统(x86/x64)和版本(5.5、5.6、5.7、8.0)的测试矩阵。

嗨,西蒙,有没有支持mysql 8.0的工具? - Lasitha Weerasinghe
1
@LasithaWeerasinghe 我不知道有没有,但是mariadb4j可以与更新的驱动程序版本结合使用,以获得相同的功能。我编辑了我的帖子,以展示你应该在pom.xml中添加什么来获取这个更新的驱动程序。 - Simon Baars
看起来自版本4.5.0开始支持MySQL 8.0(参考提交记录)。 - Robin

18

8
对于在此回答发布后很久之后阅读此回答的其他人,MXJ在MySQL 5.1.40、Connector/J 5.0.11版本停止开发。请参见http://dev.mysql.com/doc/connector-mxj/en/connector-mxj-versions.html。 - Peter Dolberg
@PeterDolberg,有没有其他的软件包可以在 JUnit 测试时实现运行 MySQL(嵌入式)的功能? - TheConstructor
1
@TheConstructor 请检查我的答案。Wix嵌入式MySQL可能是您的解决方案。 - Simon Baars

7

2
请注意,MySQL Connector/MXJ的开发已经停止。 - Ron Klein
还有什么替代方案吗?有没有可以自由嵌入的解决方案? - Marouane Gazanayi

6

看起来你需要一个嵌入式数据库。虽然MySQL Connector看起来不错,但它会启动一个单独的服务器进程。如果你想让数据库服务器在Java虚拟机中运行,有几个适用于Java的嵌入式数据库。

我见过使用最多的两个是:

  1. Apache Derby / JavaDB
  2. HSQL

7
我在使用HSQL来测试一个使用Oracle的生产系统时,遇到了非常糟糕的经历。由于行为上的差异,测试需要进行特定的hack操作,或者更糟糕的情况是没有编写测试用例,因为这太麻烦了。我认为最重要的是创建一个尽可能接近实际情况的测试环境。使用一些额外的系统资源通常是可以接受的权衡。 - oksayt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接