当前位置: 首页 > 知识库问答 >
问题:

Spring的嵌入式HSQL数据库能否支持Sybase方言?

南宫炜
2023-03-14

我希望能够在使用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文件中使用哪个DAO。

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

共有1个答案

井镜
2023-03-14

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

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

我的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)看起来像这样,并注入赛贝斯方言

<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 {
    ...
}
 类似资料:
  • 问题内容: H2 对于支持不同SQL方言的各种其他数据库(例如MS SQL Server,MySQL,Oracle等)具有一系列兼容模式。但是,在Spring中设置嵌入式数据库时,找不到任何相应的设置。如果我例如在生产中使用Oracle而在测试期间使用H2,这是否意味着我必须使用没有任何方言特定功能的“普通” SQL?我忽略了什么吗? 问题答案: 根据H2文档,Oracle兼容模式非常有限。 例如

  • 问题内容: 我目前正在使用以下设置在嵌入式数据库上运行测试之前在嵌入式数据库中创建架构 在我的应用程序上下文中 createSchema.sql hibernate属性 我的问题是这是最好的方法。或者我可以在属性中使用其他架构名称吗?或在jdbc:embedded-database元素中设置架构名称 问题答案: 默认情况下,HSQL创建一个称为PUBLIC的架构。来源:HSQL文档 看到模式名称在

  • 我有一个Spring Boot和嵌入式Mongo DB的项目,我也想查找存储在那里的数据。我学习了本教程https://springframework.guru/spring-boot-with-embedd-mongoDB/

  • 15.8 内嵌数据库支持 org.springframework.jdbc.datasource.embedded包包含对内嵌Java数据库引擎的支持。如对HSQL, H2, and Derby原生支持,你还可以使用扩展API来嵌入新的数据库内嵌类型和Datasource实现。 15.8.1 为什么使用一个内嵌数据库? 内嵌数据库因为比较轻量级所以在开发阶段比较方便有用。包括配置比较容易,启动快,

  • 我想使用REST API的HAL格式来包含嵌入式资源。我在API中使用Spring HATEOAS,Spring HATEOAS似乎支持嵌入式资源;但是,没有关于如何使用此功能的文档或示例。 有人能提供一个如何使用Spring HATEOAS包含嵌入式资源的例子吗?

  • 问题内容: 我可以在文件中保留这样的嵌入式注释吗? 我不希望在CSS输出中使用此注释。 问题答案: 在SASS中要考虑两种不同类型的注释。 单行注释将由.scss预处理器删除,并且不会出现在.css文件中。 多行注释是有效的CSS,在从.scss到您的.css文件的转换之间将保留*。 听起来内联注释是您想要的。