【问题标题】:Can I change H2 embedded DB dialect to Sybase?我可以将 H2 嵌入式数据库方言更改为 Sybase 吗?
【发布时间】:2017-10-30 20:41:12
【问题描述】:

我需要在我的项目上编写一些使用 Sybase DB 的测试。这些测试与运行一些 SQL 请求密切相关。为此,我们必须使用带有 h2 嵌入式数据库的 myBatis 和 DBunit 方法。但问题是一些 Sybase 和 h2 对于相同的函数有一些不同的语法。

例子:

    Sybase: CONVERT(data_type, expression [, format_style])
    H2: CONVERT(value, data_type)

如您所见,我是否会通过基于 H2 方言测试的 SQL 编写,但在 Sybase 上运行它的应用程序中的代码肯定会失败。

问题:

  1. 有什么方法可以让 H2 DB 理解 Sybase 方言?
  2. 有什么方法可以使 SQL 在不同的 DB 上兼容,这正是我需要的 bcos 将来我们可以移动到另一个 DB 并重写所有 SQL 将是一个非常糟糕和耗时的机会?

【问题讨论】:

    标签: sybase h2 mybatis dbunit


    【解决方案1】:

    1:仅当您实现了一个名为 CONVERT() 的 sql 函数,该函数采用相同的参数。

    2:一旦您超越了 SELECT 语法等基础知识(然后仍然......),SQL 方言很快就会变得非常不同。内置函数往往是特定于供应商的。另外,请参阅上面的答案 1,

    【讨论】:

      【解决方案2】:

      在更糟糕的情况下,您可以使用 databaseIdProvider 并为每个不同的数据库提供不同的 SQL。

      确保以下配置到位:

      <databaseIdProvider type="DB_VENDOR">
          <property name="HSQL Database Engine" value="hsql" />
          <property name="Adaptive Server Enterprise" value="sybase"/> 
      </databaseIdProvider>
      

      那么在mapper.xml中,你可以这样做:

      供双方使用:

      <select id="select1" resultType="string" parameterType="int">
          select
          name from common where id=#{value}
      </select>
      

      仅供 hsql 使用:

      <select id="select1" resultType="string" parameterType="int" databaseId="hsql">
          ...
      </select>
      

      仅供sybase使用

      <select id="select1" resultType="string" parameterType="int" databaseId="sybase">
          ...
      </select>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-11
        • 2010-09-14
        • 2017-10-06
        • 2023-03-19
        • 2017-03-05
        • 2021-06-25
        • 2016-01-22
        • 1970-01-01
        相关资源
        最近更新 更多