JavaBeansとして取得する
DBから取得した値を、そのままJavaBeansに格納して利用することができればとても便利です。そんなときは、BeanHandlerを使用します。このBeanHandlerは、取得した値の列名に対応するJavaBeansのプロパティに自動的にセットして格納します。なお、データベースの列名とJavaBeansのプロパティ名は一致させておく必要がありますので、注意が必要です。
このBeanHandlerを使用するときは、あらかじめ結果に対応するJavaBeansのクラスを作成する必要があります。そして、作成したクラスをBeanHandlerの引数に指定します。
public class BookBean { private String id; private String name; private int price; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } }
public BookBean getBean() throws SQLException { ResultSetHandler<BookBean> rs = new BeanHandler<BookBean>(BookBean.class); BookBean book = runner.query( "select id,name,price from book where id=\"b001\"", rs); return book; }
ある条件にマッチするデータの検索結果が複数レコードある場合はどうすればよいでしょうか? そのときは、BeanHandlerではなく、BeanListHandlerを使用します。
public List<BookBean> getBeanList() throws SQLException { ResultSetHandler<List<BookBean>> rs = new BeanListHandler<BookBean>(BookBean.class); List<BookBean> book = runner.query( "select id,name,price from book", rs); return book; }
データベースの値を更新しよう
DBUtilsでは、レコードの参照だけでなく、レコードの挿入/更新/削除も行うことができます。挿入/更新/削除はQueryRunnerのqueryメソッドではなく、updateメソッドを使用します。
レコードを挿入/更新/削除する
レコードを挿入/更新/削除するときは、次のようにQueryRunnerのupdateメソッドにSQL(INSERT文/UPDATE文/DELETE文)を引数として渡します。
public void update() throws SQLException { // データ挿入 runner.update("INSERT INTO BOOK VALUES (\"b004\",\"よく分かるSDN\",1500)"); // データ更新 runner.update("UPDATE BOOK SET PRICE=2000 WHERE ID =?","b002"); // データ削除 runner.update("DELETE FROM BOOK WHERE ID=?","b003"); }
なお、updateメソッドで第2引数に指定した値を、SQL文に渡すことができます。
複数のレコードをまとめて挿入/更新/削除する
データを挿入/更新するときは、1件ずつではなく複数まとめて処理したいことがあります。そのときは、次のようにQueryRunnerのbatchメソッドを使います。このbatchメソッドはSQLを引数として渡し、第2引数に繰り返したいデータを渡します。例えば、次のサンプルコードの場合、以下のデータをListにまとめて、insert文でデータベースにレコードを挿入しています。
id | name | price |
---|---|---|
b010 | Scara入門 | 2500 |
b020 | わくわくRuby | 3500 |
public void insertBatch() throws SQLException { // データ一括挿入 List<Object[]> params = new ArrayList<Object[]>(); params.add(new Object[]{ "b010" , "Scala入門 第2版", 2500}); params.add(new Object[]{ "b020" , "わくわくRuby" , 3500}); runner.batch("INSERT INTO BOOK VALUES ( ? , ? , ?)", params.toArray(new Object[0][])); }
これにより、2件のレコードがbookテーブルに追加されました。
おわりに
RDBMSへの接続ライブラリである「DBUtils」を使用すると、次のことが効率よく行えます。
- データベースの検索結果をJavaのオブジェクトに自動的にマッピング
- データベース接続のためのコードの簡素化
データベースの接続があるコードは煩雑になりがちですが、これらのコード量が減るのでプログラマが楽になるだけでなく、プログラムの可読性が上がります。また、データベースの値を参照するときの単純なコードミスや、コネクションの切断し忘れなどのうっかりミスを減らすことができます。
短期間で品質の高いシステムを効率よく開発するために、「DBUtils」を使ってみてはいかがでしょうか?