记录:Spring JdbcTemplate查询返回的Map与数据库对查询字段名的处理

1.先说Spring JdbcTemplate查询返回的Map

在使用Spring提供的JdbcTemplate类对数据库进行操作的时候,直接使用如下所示的系列重载方法需要特别注意返回的Map类型。

org.springframework.jdbc.core.JdbcTemplate

publicMap<String,Object>queryForMap(Stringsql,Object[]args,int[]argTypes)throwsDataAccessException{returnqueryForObject(sql,args,argTypes,getColumnMapRowMapper());}publicList<Map<String,Object>>queryForList(Stringsql,Object[]args,int[]argTypes)throwsDataAccessException{returnquery(sql,args,argTypes,getColumnMapRowMapper());}

JdbcTemplate在处理查询结果包装成Map的时候使用了自己定义的Map,该Map继承自LinkedHashMap,且其key值的大小写不区分。

该Map是org.springframework.util.LinkedCaseInsensitiveMap,其内部用一个Map来维护key的映射关系:小写key-原始key,而LinkedCaseInsensitiveMap本身的映射关系仍然是:原始key-元素。这样在处理添加,删除,获取的时候就可以实现忽略key的大小写。

例如获取指定key映射的元素:

@OverridepublicVget(Objectkey){if(keyinstanceofString){returnsuper.get(this.caseInsensitiveKeys.get(convertKey((String)key)));}else{returnnull;}}

那么在实际开发中使用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)ALTERDATABASE[DatabaseName]COLLATEChinese_PRC_CI_AI–大小写敏感(Case-Sensitivity)ALTERDATABASE[DatabaseName]COLLATEChinese_PRC_CS_AI

这里两个问题放在一起,源于JdbcTemplate中使用的LinkedCaseInsensitiveMap,当然也是应该开发过程中犯的一些错,,如数据库设计时命名不规范,AS别名还不规范,

任何开发前期的考虑不周全,设计不严谨,开发的松懈,测试的不到位都是部署后发生灾难的根源。码农总是急于编码,真的是一场恶梦!

本文出自 “野马红尘” 博客,谢绝转载!

离开之后,我想你不要忘记一件事:不要忘记想念我。

记录:Spring JdbcTemplate查询返回的Map与数据库对查询字段名的处理

相关文章:

你感兴趣的文章:

标签云: