我希望能够在使用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。
答案 0 :(得分:1)
我选择通过为DAO实现几个方言助手类来解决此问题。我的目标是
我的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类本身通过加载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 {
...
}