java - 如何使用 Spring 的 JdbcTemplate 忽略数据库表名大小写敏感?

标签 java spring case-sensitive jdbctemplate

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

显然,诸如“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 执行不区分大小写的查询?

最佳答案

如果您支持大量数据库,您可能会发现更多问题,而不仅仅是区分大小写的名称。这是一个很好的机会来强调使用接口(interface)抽象数据访问以及为每个受支持的数据库供应商编写实现的重要性。

在您的应用程序中,您应该为界面编写代码。当您使用 spring 时,您可以使用依赖注入(inject)在数据访问层中使用适当的数据库实现;这只是对应用程序上下文配置文件的一个微不足道的更改。

关于java - 如何使用 Spring 的 JdbcTemplate 忽略数据库表名大小写敏感?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10248812/

相关文章:

java - 在 Java 中使用 BufferedWriter 格式化双输出

java - 当java代码中的可见性更改为可见时,进度条不显示

arrays - C 代码在字符串中删除不区分大小写的子字符串时出现问题

java - 运行 Jersey 测试时初始化 Spring beans

java - 为什么 JAX-RS POST 不适用于多值映射

mysql - order by 的 SQL 规范中的区分大小写 - oracle 与 mysql

javascript - 这个奇怪的大写函数的目的是什么?

java - 无法实例化 Pageable bean

java - 正则表达式,在一个句子中匹配两个序列

spring - JAXBElement : providing codec (/converter? ) 对于类 java.lang.Class