1.先说Spring JdbcTemplate查询返回的Map
在使用Spring提供的JdbcTemplate类对数据库进行操作的时候,直接使用如下所示的系列重载方法需要特别注意返回的Map类型。
org.springframework.jdbc.core.JdbcTemplate
public Map<String, Object> queryForMap(String sql, Object[] args, int[] argTypes) throws DataAccessException { return queryForObject(sql, args, argTypes, getColumnMapRowMapper()); }
public List<Map<String, Object>> queryForList(String sql, Object[] args, int[] argTypes) throws DataAccessException { return query(sql, args, argTypes, getColumnMapRowMapper()); }
JdbcTemplate在处理查询结果包装成Map的时候使用了自己定义的Map,该Map继承自LinkedHashMap,且其key值的大小写不区分。
该Map是org.springframework.util.LinkedCaseInsensitiveMap,其内部用一个Map来维护key的映射关系:小写key-原始key,而LinkedCaseInsensitiveMap本身的映射关系仍然是:原始key-元素。这样在处理添加,删除,获取的时候就可以实现忽略key的大小写。
例如获取指定key映射的元素:
@Override public V get(Object key) { if (key instanceof String) { return super.get(this.caseInsensitiveKeys.get(convertKey((String) key))); } else { return null; } }
那么在实际开发中使用JdbcTemplate对象查询后获得Map,然后获取指定key(数据库字段名)的值时下面所示获取同样的结果。
System.out.println("clientId=" + m.get("clientId") + ", clientid=" + m.get("clientid"));
2.接下来说数据库对查询字段名的处理(字段名的大小写问题)
Postgresql:
由于Postgresql是大小写敏感,对数据库中的对象名称默认采用小写,查询字段名统一处理为小写,而SQL是不区分大小写。
如果要在Postgresql中使得查询字段名大小写敏感需要用双引号("")引住,数据库中的对象名同理。
如果要在Postgresql中使用字符串常量,则需要用单引号('')引住。
!!Postgresql数据库使用需要格外注意命名。
MySQL:
Linux下:数据库名,表名,表的别名,变量名严格区分大小写(操作系统本身是区分大小写的)
列名和列的别名不区分大小写。
Windows下:不区分大小写,不过Mysql有个系统变量lower_case_table_names可以帮助在windows下配置[my.ini]使得表名数据库名区分大小写。
!!最好是约定一种较为合理能被开发人员和DBA接受的命名策略。
SQL Server:
SQLServer是否区大小写取决于其安装方式,可以通过设置来校对。
比如通过修改数据库来设置是否区分大小写:
--大小写不敏感(Case-Insensitivity) ALTER DATABASE [DatabaseName] COLLATE Chinese_PRC_CI_AI --大小写敏感(Case-Sensitivity) ALTER DATABASE [DatabaseName] COLLATE Chinese_PRC_CS_AI
其它可以设置的内容,可以参考:http://technet.microsoft.com/zh-cn/library/ms174269.aspx
这里两个问题放在一起,源于JdbcTemplate中使用的LinkedCaseInsensitiveMap,当然也是应该开发过程中犯的一些错,如数据库设计时命名不规范,AS别名还不规范,
任何开发前期的考虑不周全,设计不严谨,开发的松懈,测试的不到位都是部署后发生灾难的根源。码农总是急于编码,真的是一场恶梦!
本文出自 “野马红尘” 博客,谢绝转载!