JDBC 4.1

Java SE 7に含まれるJDBC 4.1には、次の機能が導入されています。

  • try-with-resources文を使用することで、ConnectionResultSet、およびStatementタイプのリソースを自動的に解放することができます。
  • RowSet 1.1: RowSetFactoryインタフェースとRowSetProviderクラスが導入されたため、使用しているJDBCドライバでサポートされているすべての行セットを作成できるようになりました。

try-with-resources文を使用したJDBCリソースの自動解放

try-with-resources文を使用すると、SQLExceptionやその他の例外が投げられたかどうかに関係なく、java.sql.Connectionオブジェクトやjava.sql.Statementオブジェクト、またjava.sql.ResultSetオブジェクトを自動的に解放できます。 try-with-resources文は、try文と1つ以上の宣言済みリソース(区切り文字としてセミコロンを使用)で構成されます。

詳しくは、The try-with-resources Statementを参照してください。

次の例では、Statementオブジェクトであるstmtを自動的に解放するため、try-with-resources文が使用されています。

  public static void viewTable(Connection con) throws SQLException {

    String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES";

    try (Statement stmt = con.createStatement()) {

      ResultSet rs = stmt.executeQuery(query);

      while (rs.next()) {
        String coffeeName = rs.getString("COF_NAME");
        int supplierID = rs.getInt("SUP_ID");
        float price = rs.getFloat("PRICE");
        int sales = rs.getInt("SALES");
        int total = rs.getInt("TOTAL");
        System.out.println(coffeeName + ", " + supplierID + ", " + price +
                           ", " + sales + ", " + total);
      }
    }
  }

次の文は、stmtという1つのリソースを宣言したtry-with-resources文であり、このオブジェクトはtryブロックの終了時に自動的に解放されます。

    try (Statement stmt = con.createStatement()) {

      // ...

    }

RowSet 1.1: RowSetFactoryインタフェースとRowSetProviderクラスを使用した行セットの作成

RowSetFactoryのインスタンスを使用して、RowSetオブジェクトを作成できます。 次の例では、RowSetFactoryのインスタンスを使用して、JdbcRowSetオブジェクトであるjdbcRsが作成されています。

  public void testJdbcRowSet(String username, String password) throws SQLException {

    RowSetFactory myRowSetFactory = null;
    JdbcRowSet jdbcRs = null;
    ResultSet rs = null;
    Statement stmt = null;

    try {

      myRowSetFactory = RowSetProvider.newFactory();
      jdbcRs = myRowSetFactory.createJdbcRowSet();

      jdbcRs.setUrl("jdbc:myDriver:myAttribute");
      jdbcRs.setUsername(username);
      jdbcRs.setPassword(password);

      jdbcRs.setCommand("select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES");
      jdbcRs.execute();

      // ...

次の文では、デフォルトのRowSetFactory実装であるcom.sun.rowset.RowSetFactoryImplを使用して、RowSetProviderオブジェクトのmyRowSetFactoryが作成されています。

      myRowSetFactory = RowSetProvider.newFactory();

また、使用しているJDBCドライバに固有のRowSetFactory実装が含まれる場合は、newFactoryの引数にこれを指定できます。

次の文では、JdbcRowSetオブジェクトであるjdbcRsが作成され、データベース接続プロパティが設定されています。

      jdbcRs = myRowSetFactory.createJdbcRowSet();

      jdbcRs.setUrl("jdbc:myDriver:myAttribute");
      jdbcRs.setUsername(username);
      jdbcRs.setPassword(password);

RowSetFactoryインタフェースには次のメソッドが含まれており、JDBC 4.1以降で使用できる各種のRowSet実装を作成できます。

  • createCachedRowSet
  • createFilteredRowSet
  • createJdbcRowSet
  • createJoinRowSet
  • createWebRowSet