P6SpyDriver的一个疑似BUG

无意中发现P6SpyDriver的一个疑似BUG。当SQL查询语句返回的列,列名存在重复的情况时,ResultSet.getString()获取列的值时,同名列排在后面的列值均会被该同名列的顺序为第一的列的值所覆盖。
1。数据库驱动为:

<driver-class>com.p6spy.engine.spy.P6SpyDriver</driver-class>

测试代码如下:

String sql="select a.idcard,b.idcard,a.name,b.name from a,b where a.id = b.id";
Statement stmt = null;
ResultSet rs = null;
Connection con = null;
try {
con = getConnection();
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
while (rs.next()) {
int index =1;
System.out.print(rs.getString(index++)+"---");
System.out.print(rs.getString(index++)+"---");
System.out.print(rs.getString(index++)+"---");
System.out.print(rs.getString(index++));
}
}catch (SQLException e) {
e.printStackTrace();
} finally {
dbClear(con, stmt, rs);
}

a、b两表的结构和数据此处限于篇幅不在贴出。
数据库里真实数据中,a.idcard与b.idcard,以及a.name和b.name是不同的。
测试结果打印出来的记录显示:
rs.getString(2)的实际打印出来的值与rs.getString(1)相同,4与3相同,
即同名列的值,在通过下标循环取列的值时,同名列处于sql语句后面位置的列总会被该同名列处于第一位置的列的值覆盖。
通过列名取值呢,因为存在同名,肯定是取不到完全正确的数据的。

2。 当我把数据库驱动改为传统的OracleDriver后,在通过下标循环取列的值时,一切正常,所有数据正确无误。通过列名取值,因为存在同名,依然是取不到完全正确的数据的。
数据库驱动:

<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>

测试代码未变。
测试结果为:
即使列名相同,通过下标获取各同名列的值,依然为该列在数据库的实际值。

通过上面的对比测试发现,P6SpyDriver在封装OracleDriver时,处理数据这一部分确实存在差异,而不单单是为我们提供了SQL语句的打印功能。在ResultSet组装数据时,其策略与OracleDriver是不同的。

当然了,有人会说在sql里为同名列加上别名会死啊,这的确是我们平时写SQL应该注意的一个基础性方法。
但我关注的重点是P6SpyDriver在封装OracleDriver后,给我们提供了额外的有用的功能的同时,在ResultSet里对同名列的值的组装策略值得商榷。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值