Javaライブラリ(Commons)DBUtils | Hello, Stupid World!

Hello, Stupid World!

いろいろとメモ代わりに書いていきます。

H2 Databaseも入れたことだし、早速CommonsのDBUtilsを紹介します。

ダウンロードはこちらから。

http://commons.apache.org/proper/commons-dbutils/download_dbutils.cgi

DbUtils 1.5 をダウンロードしました。

ではDbUtilsを使わない時と使った時でどう変わるか見ていきます。
まずは使わない時。
JDBCでアクセスしてます。

public static void select(){
 Connection con = null;
 Statement st = null;
 ResultSet rs = null;
 try {
  Class.forName("org.h2.Driver");
  con = DriverManager.getConnection("jdbc:h2:~/test;TRACE_LEVEL_FILE=0", "sa", null);
  st = con.createStatement();
  rs = st.executeQuery("select * from User;");
  while (rs.next()) {
   String result = rs.getString(1);
   String result2 = rs.getString(2);
   System.out.println("Result = " + result + ", " + result2);
  }
 } catch (ClassNotFoundException e) {
  e.printStackTrace();
 } catch (SQLException e) {
  e.printStackTrace();
 }finally{
  try {
   if(rs != null) rs.close();
  } catch (SQLException e) {
   e.printStackTrace();
  }
  try {
   if(st != null) st.close();
  } catch (SQLException e) {
   e.printStackTrace();
  }
  try {
   if(con != null) con.close();
  } catch (SQLException e) {
   e.printStackTrace();
  }
 }
}

36行です。

次にDbUtilsを使った場合

public static void select(){
 Connection con = null;
 try {
  Class.forName("org.h2.Driver");
  con = DriverManager.getConnection("jdbc:h2:~/test;TRACE_LEVEL_FILE=0", "sa", null);
  QueryRunner qr = new QueryRunner();
  ArrayList<Object[]> users = (ArrayList<Object[]>)qr.query(con, "select * from User;", new ArrayListHandler());
  for (Object[] user : users) {
   String result = user[0].toString();
   String result2 = user[1].toString();
   System.out.println("Result = " + result + ", " + result2);
  }
 } catch (ClassNotFoundException e) {
  e.printStackTrace();
 } catch (SQLException e) {
  e.printStackTrace();
 }
 try {
  con.close();
 } catch (SQLException e) {
  e.printStackTrace();
 }
}

23行です。3分の2です。
中でも終了処理が大分簡単になります。
JDBCの場合はResultSet、Statementのクローズが必要で例外処理も
考えなければなりません。
これらをやり忘れるとコネクションが切られなくなり、いつの間にか
接続最大数になってエラーが発生したり。
そのようなエラーは発生条件の特定が難しく対処が大変です。

さらに直接、Beanに検索結果を格納する事もできます。
その場合はさらにコーディング量を減らせ、品質向上に役立ちます。

ではDbUtilsの中を見てみます。

private transient Object query(Connection conn, boolean closeConn, String sql, ResultSetHandler rsh, Object params[])
 throws SQLException
{
 PreparedStatement stmt;
 ResultSet rs;
  Object result;
 stmt = null;
 rs = null;
 result = null;

 ~

 stmt = prepareStatement(conn, sql);
 fillStatement(stmt, params);
 rs = wrap(stmt.executeQuery());
 result = rsh.handle(rs);

 close(rs);

 close(stmt);

 ~
}

見てのとおり、内部ではResultSet、PreparedStatementを使用しています。
このように面倒な作業をラッピングすることで簡単にDBアクセスができるよう
になっています。
今までJDBCしか使ったこと無い人は一度試してみると良いでしょう。