【问题标题】:Java common JDBC SQL Query strategy for Unit Test using HSQLDB and runtime using MySQL使用 HSQLDB 进行单元测试和使用 MySQL 进行运行时的 Java 通用 JDBC SQL 查询策略
【发布时间】:2020-10-23 23:04:32
【问题描述】:

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

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

(2) 如果不可能有一个同时满足 MySQL 和 HSQLDB 的通用 SQL 语法,那么基于 java 应用程序运行时配置文件拆分这个通用执行路径的最佳方法是什么,因为这个 DB 初始化是在 @ 987654321@verticle的函数哪个是应用的核心?

感谢任何建议和见解。

【问题讨论】:

    标签: java mysql hsqldb vert.x junit5


    【解决方案1】:

    解决方案:放弃 HSQLDB 并使用带有 database_to_upper=false 选项的 H2。

    【讨论】:

      【解决方案2】:

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

      对 CREATE TABLE 使用 MySQL 语法。 HSQLDB 将 MySQL 的 AUTO_INCREMENT 关键字理解为 IDENTITY 的别名。它还理解所有其他 MySQL 特定的语法。

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

      http://hsqldb.org/doc/2.0/guide/compatibility-chapt.html#coc_compatibility_mysql

      【讨论】:

      • 我不这么认为。如何将select 语句结果集反序列化为 JOCO 列表?大写列名是个问题!
      • 好的,如果您需要返回的 ResultSetMetaData 中的非大写名称,那么您确实需要为名称使用双引号。
      猜你喜欢
      • 2011-04-01
      • 2015-03-23
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 2011-07-21
      • 2016-02-27
      相关资源
      最近更新 更多