ダウンロードはこちらから。
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の中を見てみます。
~
close(rs);
~
}
見てのとおり、内部ではResultSet、PreparedStatementを使用しています。
このように面倒な作業をラッピングすることで簡単にDBアクセスができるよう
になっています。
今までJDBCしか使ったこと無い人は一度試してみると良いでしょう。
中でも終了処理が大分簡単になります。
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しか使ったこと無い人は一度試してみると良いでしょう。