我可以将H2嵌入式DB方言更改为Sybase吗?

时间:2017-10-30 20:41:12

标签: sybase h2 mybatis dbunit

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

示例:

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

因此,您可以看到我是否会根据H2方言编写SQL语言测试将被传递,但是在Sybase上运行它的应用程序中的代码肯定会失败。

问题:

  1. 有没有办法让H2 DB了解Sybase方言?
  2. 有什么方法可以让SQL在不同的数据库上兼容,这正是我需要的bcos,将来我们有可能转移到另一个数据库并重写所有SQL& #39; s将是非常糟糕和耗时的?

2 个答案:

答案 0 :(得分:0)

1:仅当您实现一个名为CONVERT()的sql函数时才使用相同的参数。

2:一旦超越SELECT语法(然后仍然......)等基础知识,SQL方言会迅速变得非常不同。内置功能往往是特定于供应商的。 Slso,见上面的答案1,

答案 1 :(得分:0)

在更糟糕的情况下,您可以使用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>