私は Ibatis と Hibernate を使ってきました。Ibatis は単純明快です。Hibernate は注意しないと複雑になる可能性がありますが、多くのことを行います。spring-jdbc は生の JDBC より優れています。
Hibernate の最大の利点は、さまざまなデータベースにマップできることです。スキーマ プレフィックスを無効にすることもできます。テスト用にインメモリ データベースを使用する、開発者に本番ターゲットとは異なるローカル データベースを使用させる (たとえば、Oracle をターゲットにしていてライセンスが問題である場合)、複数のデータベースをターゲットにできるなどのオプションがあります。Hibernate を使用すると、id ジェネレーターを簡単に交換できます。Hibernate ではネイティブ SQL がオプションですが、Ibatis では選択肢がありません。
また、Ibatis のマッピング ファイルを DRY に保つことも不可能ではありません。where句が異なる複数のクエリがある場合、カットアンドペーストが発生します。Hibernate では、重複はほとんどありません。
ところで、Ibatis と Hibernate はどちらも宣言型キャッシュ メカニズムを備えています。もちろん、Hibernate のほうがはるかに複雑です。
spring-jdbc は、私がリストした Ibatis の欠点をすべて共有しています。さらに、キャッシュメカニズムがないと思います。その主な利点は、JDBC オブジェクトが十分に隠されているわけではないため、必要に応じてより簡単に直接アクセスできることです。
Spring は 3 つの選択肢すべてと統合されます。Spring のサポートは差別化要因ではありません。
もう 1 つ: Hibernate は人工キーでうまく機能します。複合ビジネス キーを管理できますが、はるかに手間がかかります。Ibatis と spring-jdbc は、この問題が問題になるほど洗練されていません。
開発者が用心深く徹底していて、アプローチをシンプルに保つことができる場合 (たとえば、リクエストごとのセッションを使用する、セッション間でオブジェクトを保持しない、人工キーを使用するなど)、Hibernate を使用してください。Hibernate が提供するデータベースの抽象化が不要であると判断した場合、または開発者が優れたツールを使用することを信頼していないと判断した場合は、Ibatis を使用してください。ベアメタル jdbc の微調整が必要な特定のクエリを実行するためのフォールバックとして、spring-jdbc を念頭に置いてください。
ところで、Grails と GORM を使用すると Hibernate を簡単に試すことができます。セットアップ時間が大幅に短縮されるためです。Grails はメモリ内データベースから開始し、マッピング ファイルを作成しなくてもやり遂げることができます。