无意中发现P6SpyDriver的一个疑似BUG。当SQL查询语句返回的列,列名存在重复的情况时,ResultSet.getString()获取列的值时,同名列排在后面的列值均会被该同名列的顺序为第一的列的值所覆盖。
1。数据库驱动为:
com.p6spy.engine.spy.P6SpyDriver
测试代码如下:
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后,在通过下标循环取列的值时,一切正常,所有数据正确无误。通过列名取值,因为存在同名,依然是取不到完全正确的数据的。
数据库驱动:
oracle.jdbc.driver.OracleDriver
测试代码未变。
测试结果为:
即使列名相同,通过下标获取各同名列的值,依然为该列在数据库的实际值。
通过上面的对比测试发现,P6SpyDriver在封装OracleDriver时,处理数据这一部分确实存在差异,而不单单是为我们提供了SQL语句的打印功能。在ResultSet组装数据时,其策略与OracleDriver是不同的。
当然了,有人会说在sql里为同名列加上别名会死啊,这的确是我们平时写SQL应该注意的一个基础性方法。
但我关注的重点是P6SpyDriver在封装OracleDriver后,给我们提供了额外的有用的功能的同时,在ResultSet里对同名列的值的组装策略值得商榷。