nighty
折腾的年华
posts - 37, comments - 143, trackbacks - 0, articles - 0
导航
BlogJava
首页
新随笔
联系
聚合
管理
<
2011年2月
>
日
一
二
三
四
五
六
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(7)
给我留言
查看公开留言
查看私人留言
随笔分类
Eclipse(7)
Flex(2)
Java(6)
Struts2(2)
SWT/JFace(1)
信息安全(1)
心得(5)
操作系统(3)
数据库(3)
服务器部署(5)
测试(2)
系统集成(2)
软件架构(2)
随笔档案
2013年4月 (2)
2013年3月 (1)
2012年4月 (1)
2011年10月 (1)
2011年8月 (1)
2011年5月 (3)
2011年4月 (1)
2011年3月 (2)
2011年2月 (1)
2011年1月 (1)
2010年11月 (1)
2009年11月 (1)
2009年10月 (1)
2009年8月 (1)
2009年7月 (1)
2008年8月 (2)
2008年7月 (2)
2008年6月 (2)
2008年5月 (4)
2008年4月 (1)
2008年1月 (1)
2007年11月 (1)
2007年10月 (2)
2007年8月 (2)
文章分类
测试
搜索
最新评论
1. re: 关于commons dbutils组件的一个小缺陷分析
dbutils中连传入到的参数都不区分大小写??
--starhe
2. re: B/S,C/S架构混合使用[未登录]
评论内容较长,点击标题查看
--eagle
3. re: B/S,C/S架构混合使用[未登录]
补充一下:用的语言是java,开发环境是eclipse
--eagle
4. re: B/S,C/S架构混合使用
评论内容较长,点击标题查看
--Unbotrusive
5. re: struts2中重定向中文参数乱码梳理[未登录]
有用啊
--tony
阅读排行榜
1. ubuntu安装Java开发环境(38176)
2. Eclipse3.3安装中文语言包(13933)
3. Http状态码思维导图(13743)
4. B/S,C/S架构混合使用(13723)
5. 添加完整的Eclipse RCP帮助系统(8925)
评论排行榜
1. B/S,C/S架构混合使用(25)
2. 无奈只能放弃iBatis(24)
3. Eclipse3.3安装中文语言包(13)
4. httpclient3.1使用小结(8)
5. JDBC连接DB2的一些总结(8)
关于commons dbutils组件的一个小缺陷分析
Posted on 2011-02-12 17:33
寒武纪
阅读(3013)
评论(7)
编辑
收藏
所属分类:
数据库
、
Java
非常喜欢这种轻量级的JDBC封装,比起Hibernate和iBatis,可以非常自由和灵活地运用和自行二次封装,由于dbutils的BeanHandler转换方式采取了反射技术,在性能上肯定有所损失,所以项目中基本上都使用MapHandler方式来转换数据,当然就是自己写的代码多一点,也无所谓。一般的查询、子查询、联合查询、包括视图查询等等都很正常,但是发现一个比较小的问题,就是在使用聚合函数的场所,例如:select user_type, count(*) as count from `user` group by user_type这种类型查询的时候,MapHandler方式不起作用,as列都变成key为空串的K-V对,导致有许多地方使用map.get("")代码的情况出现,这种写法当然是不太好的,容易出问题。
鉴于前面没有时间了解,就都粗略使用了上面那种粗暴的map.get("")来处理,最好的情况是让dbutils组件能自动识别到as类型的列名。于是有空了就专门看了看它的源代码,发现最主要的一段代码如下:
1
public
Map
<
String, Object
>
toMap(ResultSet rs)
throws
SQLException
{
2
Map
<
String, Object
>
result
=
new
CaseInsensitiveHashMap();
3
ResultSetMetaData rsmd
=
rs.getMetaData();
4
int
cols
=
rsmd.getColumnCount();
5
6
for
(
int
i
=
1
; i
<=
cols; i
++
)
{
7
result.put(rsmd.getColumnName(i), rs.getObject(i));
8
}
9
10
return
result;
11
}
CaseInsensitiveHashMap是dbutils自定义的一个Map,忽略键大小写的K-V字典,但是key使用的是ResultSetMetaData.getColumnName(),我想问题大概出在这里,于是认真翻了翻java的api文档(开发做久了容易遗忘基础),果然,原来
getColumnName()
是:
获取指定列的名称;
而as关键字之后,使列名称变成用于显示的意义,这个时候应该使用
getColumnLabel
():
获取用于打印输出和显示的指定列的建议标题。建议标题通常由 SQL
AS
子句来指定。如果未指定 SQL
AS
,则从
getColumnLabel
返回的值将和
getColumnName
方法返回的值相同
。自己手动试验了一下,果然如所料,问题就出在这里。
所以呢,如果想要dbutils在自动转换Map及MapList时能识别聚合函数的列名,那么最好的做法就是重载这种方式,懒一点的,你就干脆修改上面那段代码,让它判断是否使用了as关键字。个人暂时搞不清楚官方为什么没有考虑这一步,有时间再思考一下!
刚进场的时候戏就落幕
Feedback
#
re: 关于commons dbutils组件的一个小缺陷分析
回复
更多评论
2011-02-12 20:22 by
蒙奇奇
关注
#
re: 关于commons dbutils组件的一个小缺陷分析
回复
更多评论
2011-02-13 19:30 by
javafan
本来就是一个Bug,无法识别别名,低版本没问题
#
re: 关于commons dbutils组件的一个小缺陷分析
回复
更多评论
2011-02-14 13:56 by
retry
什么版本? 是 1.3 么?
#
re: 关于commons dbutils组件的一个小缺陷分析
回复
更多评论
2011-02-14 18:08 by
寒武纪
@retry
是的,就是1.3
#
re: 关于commons dbutils组件的一个小缺陷分析
回复
更多评论
2011-02-19 12:21 by
jacklondon
我也用 dbutils 进行二次封装成 VelocityWeb, 也用 as , 没有发现这个 bug。 可能是因为我拦截了 map , 因为我的需求比较特别:
user_name (数据库列名) 要映射到 userName( java 属性名), 而 DBUtils 做不到,所以我拦截了重写,可能是因为这样,导致没有了这个 bug.
----------欢迎大家试用我们的单点登录
http://zhegui.biz
#
re: 关于commons dbutils组件的一个小缺陷分析
回复
更多评论
2011-02-19 12:25 by
jacklondon
DBUtils 1.3 的 release log 中有如下一段话,按说已经解决问题了:
BeanProcessor#mapColumnsToProperties now prefers to use column labels over column names (where aliases are not set, these should be identical) Fixes DBUTILS-57.
你这边用什么数据库?是否 JDBC 驱动有问题,需要升级?
#
re: 关于commons dbutils组件的一个小缺陷分析
回复
更多评论
2016-05-02 20:35 by
starhe
dbutils中连传入到的参数都不区分大小写??
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
相关文章:
Ubuntu Server 12.10 Mysql的主从复制笔记
扩展commons dbutils的JavaBean转换方式
关于commons dbutils组件的一个小缺陷分析
Powered by:
BlogJava
Copyright © 寒武纪