Spring的嵌入式HSQL数据库可以支持Sybase方言吗?

我希望能够在使用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应用程序上下文XML文件中使用哪一个。

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


我选择通过为我的DAO实施一些方言助手类来解决此问题。 我的目标是

  • 针对HSQL数据库而不是Sybase执行测试
  • 测试尽可能多的生产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" />
    

    ...和我的Test 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类自身使用HSQL dialectHelper通过加载文件spring-db-test.xml来初始化Spring

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations={
        "classpath:resources/spring-context.xml",
        "classpath:resources/spring-db-test.xml"})
    @Transactional
    @TransactionConfiguration(defaultRollback = true)
    public class MyDaoIntegrationHsqlTest {
        ...
    }
    
    链接地址: http://www.djcxy.com/p/88629.html

    上一篇: Can Spring's Embedded HSQL database support the Sybase dialect?

    下一篇: How to create a case insensitive index or constraint in HSQL