Apache Commons DbUtilsを使うと、DB接続時に使用する処理をある程度カプセル化でき、 接続・切断コーディング(特に例外処理など)を簡素化したり、 select結果の固有のBeanに格納したりすることもできます。
Apache Commons DbUtilsを使っていない場合と、使った場合でのコード例は次のようになります。
なお、両者とも接続部はコンストラクタを使用することにしています。
一目瞭然ではないでしょうか。dbutilsを使わない場合は、直接の動作とは無関係の例外処理のコードが多くなりますが、dbutilsを使うと、その辺りは全て記述しなくてよくなります。
使わない場合
private Connection conn;
public XXXDB() throws ClassNotFoundException, SQLException {
try{
InitialContext ic = new InitialContext();
DataSource ds = (DataSource)ic.lookup("java:comp/env/jdbc/saldb");
conn = ds.getConnection();
}
catch (NamingException ex){
ex.printStackTrace();
}
}
public void getXXXXXXXX(){
Statement state = null;
ResultSet rs = null;
String query = "select ・・・・・・・・・・";
try {
state = conn.createStatement();
rs = state.executeQuery(query);
while (rs.next()){
//
// データ取得後の処理
//
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
if (rs != null) rs.close();
} catch (Exception ex) {
ex.printStackTrace();
}
try {
if (state != null) state.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
使う場合
private QueryRunner qr;
public XXXDB(){
try{
InitialContext ic = new InitialContext();
DataSource ds = (DataSource)ic.lookup("java:comp/env/jdbc/xxxdb");
qr = new QueryRunner(ds);
}
catch (NamingException e){
e.printStackTrace();
}
}
public void getXXXXXXXX(){
String query = "SELECT ・・・・・・・・・・・・・・・";
ResultSetHandler<?> rsh = new MapListHandler();
try{
List<Map<String, Object>> list = (List<Map<String, Object>>)qr.query(query, rsh);
//
// データ取得後の処理
//
}catch(SQLException e){
e.printStackTrace();
}
}
また、結果をMap(keyにカラム名、valueに値)として返したり、複数行であればこのMapのListを返すこともできます(上記の例のように)。さらには、Beanクラスを定義しておけば、Beanクラスで返すこともできるので、ResultSetから一つひとつ値を取り出してごちゃごちゃする処理から、おさらばできます。
スポンサーサイト