Java : JDBC
http://d.hatena.ne.jp/odz/20070810/1186764019
http://d.hatena.ne.jp/bleis-tift/20070812/1186847743
また危険な話題に手を出しているような気がしますが・・・
RDBというのは並行アクセスを前提としたシステムなので、トランザクション分離レベルというような概念があるわけで、そのことを忘れてはまずいのではないかと。
ResultSetで読み取っている行には、排他制御のためにロックがかかっていたりするわけで、ロックをかけている行からしかデータが読み出せないようなAPIになっているわけですよ。それを、Iterableとかにしてしまうと、
ArrayList<Record> list = new ArrayList<Record>(); for (Record rec : resultset) { list.add(rec); }
なんて書けるわけで、ロックが外れてしまった行へのアクセスオブジェクトが残ってしまって危険ですよね。
それに、一行に含まれるデータを1回ですべて転送するわけではないということもありますし。例えば、1つの列が数百MBになるBLOBデータを含むような行をfetchするようなケースは、一度に読み込んでしまうわけにはいかないですよね。また、updateXXX()のためだけに選択列に含めているという場合もあります。wasNull()は対象となっている列が読み込まれていないというケースも考慮した上でのAPIになっているのではないかと。
結果の件数も、RDBの仕組み上、前もって知ることは不可能な情報なので、ResultSetに含まれないのは仕方ないというか当然ではないかと。JOINしている全表をロックしてしまうならともかく、そうでなければ、並行して実行されているSQLによって結果の件数は変わり得るので、全部処理した後までは結果の件数は確定できないですよね。
そもそも、JDBCをビジネスロジックに直接組み込もうとか考えるからおかしなことになるのであって、使いかたに応じて適切に抽象化して使えばいいだけのことで、それはどういうプログラムでも基本的に同じことじゃないのかなぁ。