结果集:按索引检索列值与按标签检索列值

2022-08-31 20:04:49

在使用JDBC时,我经常遇到这样的结构

ResultSet rs = ps.executeQuery();
while (rs.next()) {
    int id = rs.getInt(1);
    // Some other actions
}

我问自己(以及代码的作者)为什么不使用标签来检索列值:

int id = rs.getInt("CUSTOMER_ID");

我听到的最好的解释是关于性能的。但实际上,它是否使处理速度非常快?我不这么认为,尽管我从未进行过测量。即使按标签检索会有点慢,但在我看来,它提供了更好的可读性和灵活性。
那么有人可以给我很好的解释,避免按列索引而不是列标签检索列值吗?这两种方法的优缺点是什么(也许,关于某些DBMS)?


答案 1

警告:我在这里要变得夸张,因为这会让我发疯。

99%*的时间,这是一个荒谬的微优化,人们有一些模糊的想法使事情“更好”。这完全忽略了一个事实,即除非您始终处于数百万个SQL结果的极其紧凑和繁忙的循环中,希望这是罕见的,否则您永远不会注意到它。对于每个不这样做的人来说,维护、更新和修复列索引中的 bug 的开发人员时间成本远远大于性能极差的应用程序的硬件增量成本。

不要像这样编写代码优化。维护人员的代码。然后进行观察、测量、分析和优化。再次观察,再次测量,再次分析,再优化。

优化几乎是开发的最后一步,而不是第一步。

* 数字是编造的。


答案 2

默认情况下,应使用字符串标签。

优点:

  • 列顺序的独立性
  • 更好的可读性/可维护性

缺点:

  • 您无法控制列名(通过存储过程访问)

你更喜欢哪一个?

整数?

int i = 1;  
customerId = resultSet.getInt(i++);  
customerName = resultSet.getString(i++);  
customerAddress = resultSet.getString(i++);

还是字符串?

customerId = resultSet.getInt("customer_id");  
customerName = resultSet.getString("customer_name");  
customerAddress = resultSet.getString("customer_address");

如果在位置 1 处插入了新列,该怎么办?您更喜欢哪种代码?或者,如果更改了列的顺序,则需要更改哪个代码版本?

这就是默认情况下应使用字符串标签的原因。


推荐