2012-04-20 950 views
2

我们的Java(JDK6)应用程序必须支持不同的数据库,例如Oracle,SQL Server和DB2。我们使用Spring 3.0和JDBCTemplate进行数据库访问。我们的客户之一使用SQL Server 2005,区分大小写并自动设置大写的表名。如何使用Spring的JdbcTemplate忽略数据库表名区分大小写?

显然,诸如“select * from mytablename m”之类的查询不适用于所述客户端,因为他将拥有表MYTABLENAME。

对于下面的代码,例如,我得到一个不错的例外:

this.jdbcTemplate.queryForOject("select * from mytablename m"); 
`Exception in thread "main" org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [select * from mytablename m]; nested exception is java.sql.SQLException: Invalid object name 'mytablename'.` 

我卡具有相适应的代码 - 因为我不能改变我的客户的数据库选项 - 这样最显而易见的解决方案是将我们的查询中的所有表名称大写。我知道这个客户端可以工作,但是如果一个新客户端拥有一个具有区分大小写和小写表名的数据库呢?

到目前为止,我还没有成功找到更广泛的解决方案。我发现的大多数答案都需要更改数据库的区分大小写或重写查询。我试过使用:this.jdbcTemplate.setResultsMapCaseInsensitive(true);,但如果我理解的很好,它只适用于我的查询结果,而不是查询本身。

有没有办法使用Spring的JdbcTemplate执行不区分大小写的查询?

回答

2

如果要支持大量的数据库,你可能会发现更多的问题不仅仅是区分大小写的名字。这是一个很好的机会,强调用接口抽象数据访问的重要性,并为每个支持的数据库供应商编写实现。

在您的应用程序中,您应该编码到界面。在使用spring时,可以使用依赖注入在数据访问层中使用适当的数据库实现;它对应用程序上下文配置文件只是一个微不足道的变化。

+0

同意,这可能是最好的解决方案。 – Tarek 2012-04-20 16:44:20

0

我认为你的问题在于,在MS-SQL服务器上userreserverd keyword

也看看这里:Is SQL syntax case sensitive?

+0

其实用户只是一个例子。我会改变我的问题。 – Tarek 2012-04-20 15:25:51

+0

虽然我不确定这是否是实际遇到的问题,但它肯定是可疑的,并且有一些需要避免的地方。其实,我很确定'user'是_all_ RDBMS上的一个保留字。如果OP可以为我们提供一个不同的例子,这应该很容易验证。 – 2012-04-20 15:28:59

相关问题