用于使用HSQLDB进行单元测试和使用MySQL进行运行时的Java通用JDBC SQL查询策略

用于使用HSQLDB进行单元测试和使用MySQL进行运行时的Java通用JDBC SQL查询策略,java,mysql,hsqldb,vert.x,junit5,Java,Mysql,Hsqldb,Vert.x,Junit5,我正在开发JavaVert.x3应用程序。我使用HSQLDB进行内存中的DB测试,使用MySQL 8.0.20进行运行时测试。部署vertx verticle时,它会初始化数据库和表。由于这是一个常见的代码,并且HSQLDB和MySQL之间存在不同的SQL语法,更可笑的是,HSQLDB将所有属性名称大写,我必须双引号将属性使用小写。我想知道如何做到这一点。以下是我的问题: (1) HSQLDB使用“IDENTITY”关键字创建内存中的数据库表。这将导致MySQL数据库中出现运行时错误,因为“ID

我正在开发JavaVert.x3应用程序。我使用HSQLDB进行内存中的DB测试,使用MySQL 8.0.20进行运行时测试。部署vertx verticle时,它会初始化数据库和表。由于这是一个常见的代码,并且HSQLDB和MySQL之间存在不同的SQL语法,更可笑的是,HSQLDB将所有属性名称大写,我必须双引号将属性使用小写。我想知道如何做到这一点。以下是我的问题:

(1) HSQLDB使用“IDENTITY”关键字创建内存中的数据库表。这将导致MySQL数据库中出现运行时错误,因为“IDENTITY”不是有效的关键字。这是我现在面临的一个挑战

(2) 如果不可能有一个同时满足MySQL和HSQLDB的公共SQL语法,那么基于java应用程序运行时概要文件分割此公共执行路径的最佳方法是什么,因为此DB初始化是在作为应用程序核心的verticle的
start
函数中完成的


任何建议和见解都将不胜感激。

解决方案:抛弃HSQLDB,将H2与
数据库\u to_upper=false
选项一起使用。

您可以使用MySQL兼容模式创建HSQLDB数据库(将
sql.syntax\u mys=true
附加到JDBC URL中。在此模式下,您可以执行以下操作:

使用MySQL语法创建表。HSQLDB理解MySQL的AUTO_INCREMENT关键字作为标识的别名。它还理解所有其他MySQL特定语法

列名的大写其实不是问题。列名大写后,您可以使用任何大小写,而不必在SELECT语句中引用。这意味着您可以在HSQLDB上运行与MySQL相同的查询


请参见

我不这么认为。如何将
select
语句结果集反序列化为一个JOCO列表?大写列名是一个问题!好的,如果在返回的ResultSetMetaData中需要非大写的名称,则需要对名称使用双引号。