1

我希望能够在使用 HSQL 的单元/集成测试中支持以下 Sybase 15 ASE 语法...

create table #myTable (value varchar(12) NULL)

HSQL 无法识别临时表是如何命名的,并且对#字符犹豫不决。相反,HSQL 想使用这样的东西......

create temporary table myTable (value varchar(12) NULL)

或者,根据他们的文档,HSQL 也支持大多数 ANSI-92 SQL,但是 Sybase ASE 15 对 ANSI-92 SQL 没有很好的支持,包括如何创建临时表,因此以下内容在 Sybase 中不起作用,但在 HSQL 中起作用...

DECLARE LOCAL TEMPORARY TABLE mytable (value varchar(12) NULL)

从我尝试过的所有内容中,我无法想出一种适用于 Sybase 和 HSQL 的通用语法。有谁知道解决这个问题的干净方法?

我认为我唯一的选择是为每种数据库方言创建单独的 DAO,并控制在 Spring Application Context XML 文件中使用哪一个。

我的数据源不使用 Hibernate,只使用 Spring 的 JdbcTemplate。

4

1 回答 1

1

我选择通过为我的 DAO 实现几个方言助手类来解决这个问题。我的目标是

  1. 针对 HSQL 数据库而不是 Sybase 执行测试
  2. 尽可能多地测试我的生产 DAO,包括 RowMapper 和针对生产中使用的数据库模式的各种 SELECT/INSERT 语句(但在 HSQL 中实现)

我的 DAO 最终看起来像这样(注意被注入的 DialectHelper)......

@Repository
public class MyDaoJdbc MyDao {

    private DialectHelper dialectHelper;

    /* the meat of the DAO removed for clarity */

    @Override
    public void createTemporaryTable() {        
        getSimpleJdbcTemplate().update(dialectHelper.getTempTableCreateSql());
    }

    @Autowired
    public final void setDialectHelper(DialectHelper dialectHelper) {
        this.dialectHelper = dialectHelper;
    }
}

...我的生产 Spring 配置 (spring-db.xml) 看起来像这样并注入了 Sybase 方言

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName"    value="com.sybase.jdbc2.jdbc.SybDriver" />
    <property name="url"                    value="${jdbc.url}" />
    <property name="username"           value="${jdbc.username}" />
    <property name="password"           value="${jdbc.password}" />
</bean>

<bean id="dialectHelper" class="com.acme.myapp.jdbc.DialectHelperSybase" />

...我的测试 Spring 配置(spring-db-test.xml)看起来像这样并注入了 HSQL 方言

<jdbc:embedded-database id="dataSource" type="HSQL">
     <jdbc:script location="classpath:/resources/schema.sql"/>
     <jdbc:script location="classpath:/resources/test-data.sql"/>
</jdbc:embedded-database>

<bean id="dialectHelper" class="com.acme.myapp.dao.jdbc.DialectHelperHsql" />

DialectHelper 类提供了一种将不兼容的数据库语法从 DAO 中分离出来的方法......

public class DialectHelperHsql implements DialectHelper {
    @Override
    public String getTempTableCreateSql() {
        return "create temporary table myTable (value varchar(12) NULL)";
    }
}

public class DialectHelperSybase implements DialectHelper {
    @Override
    public String getTempTableCreateSql() {
        return "create table #myTable (value varchar(12) NULL)";
    }
}

Test 类本身通过加载文件 spring-db-test.xml 使用 HSQL dialectHelper 初始化 Spring

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={
    "classpath:resources/spring-context.xml",
    "classpath:resources/spring-db-test.xml"})
@Transactional
@TransactionConfiguration(defaultRollback = true)
public class MyDaoIntegrationHsqlTest {
    ...
}
于 2012-08-22T08:16:31.423 回答