流れるようにSQLっぽくO/RマッピングできるS2JDBCJava初心者が超俊敏にWebアプリを作る方法(最終回)(2/3 ページ)

» 2009年03月18日 10時00分 公開
[新田智啓株式会社パワーエッジ]

S2JDBCでDB操作をしてみよう

 次に、DBとJavaをつなぐ操作をするクラスを作成します。今回はDoltengで生成されたテーブルにアクセスするサービスクラスを利用します。

DBアクセスの準備も自動生成!

 Doltengで生成された、サービスクラスはAbstractServiceクラスを継承して作られます。AbstractServiceクラスはS2AbstractServiceクラスが継承されています。この中には、「JdbcManager」という変数が宣言されており、この変数を使ってDBアクセスを行います。DeptServiceクラスは、下記のように定義されています。

public class DeptService extends AbstractService<Dept>

 Deptテーブルにアクセスするサービスなので、AbstractServiceのGenericsジェネリック型)にDeptクラスを指定しています。これだけで、Deptテーブルにアクセスを操作するクラスができてしまいます。

図1 自動生成されたサービスクラス 図1 自動生成されたサービスクラス

 また、Doltengで生成されたファイルには、主キーでアクセスできる「findById」というメソッドが追加されています。これで、DBにアクセスする準備ができました。

DB操作クラスで利用できるデフォルトのメソッド

 DBに関連付いたサービスクラスで利用できるメソッドは表のようになっています。

メソッド名 概要 戻り値
findAll() 全件取得 List<T>
findByCondition(BeanMap conditions) 条件を指定して取得 List<T>
getCount() 件数取得 long
insert(T entity) 登録 int
update(T entity) 更新(@Idを付加した値(主キー)を利用して) int
delete(T entity) 削除(@Idを付加した値(主キー)を利用して) int
表 DB操作クラスにデフォルトで生成されるメソッド

selectメソッドを利用したDB検索・参照

 DB操作の例として、selectメソッドを利用したDB検索・参照の方法を解説します。S2JDBCでは、SQLライクな「流れるようなインターフェイス」を採用しています。

Deptテーブルからデータを取得する例
    select()
        .where("id in (? , ?)", 11, 22)
        .orderBy("deptName desc")
    .getResultList();

 この例ですと、idが11もしくは22のDeptデータの一覧が取得できます。一覧を取得したいときには、getResultList()メソッドを最後に付けて、SQLを実行します。

Deptテーブルからデータを1件だけ取得する例
    select()
        .where("id = ?", 1)
    .getSingleResult();

 SQLの結果が必ず1件になる場合は、getSingleResult()を最後に付けてSQLを実行します。

 Javaで書いているにもかかわらず、SQLを理解していれば、何が取得したいかが一目で分かります。また、外部ファイルなどの設定SQLファイルなども必要ありません。

外部ファイルのSQLを利用する場合

 ただ、複雑なSQLを実行する際や実際のSQLでパフォーマンスチューニングをしたいケースもあると思います。そのような、必要なときのみ外部にSQLを置き、SQLを実行できます。その際に利用できるメソッドが用意されています。外部SQLを利用するときには、以下のメソッドを利用します。

SQL定義ファイルを利用してSQLを実行
selectBySqlFile(Class<T2> baseClass, String path);

selectBySqlFile(Class<T2> baseClass, String path, Object parameter)

updateBySqlFile(String path)

updateBySqlFile(String path, Object parameter)

 SQLファイルを利用したものについては、ここでは説明を割愛します。公式ページを参照してみてください。SQLファイルを使う方法も業務を使用する際は非常に有用であり、強力な機能を持っています。

S2JDBCを利用した超簡単なトランザクション管理

 S2JDBCを利用したトランザクション管理について説明します。実は、いままで見てきたソースコードで、すでにトランザクション管理されています。しかし、コードにはまったく出てきていませんね。

もうDB操作にtry/catch/finally文はいらない!

 これは実は、トランザクションはDIコンテナであるSeasar 2のDI機能のDI機能によって、見えないところで管理されているからです。これは非常にお手軽です。実際にJavaでDB操作の開発を行ったことがある人ならば、その便利さが分かると思いますが、いままでDBにアクセスするときには何度となくtry、catch、finallyを書いているソースコードもあったと思います。

 トランザクションの開始や終了などは決まったことであり、そこはフレームワークにコントロールを任せてしまえばよいのです。自分が書くソースコードは、実際にやりたいロジックの部分だけでよいのです。

コミットとロールバックのタイミング

 現在のトランザクションタイミングはActionが実行されてからActionが正常終了するまでです。もしActionがExceptionを発生させた場合、ロールバックが実行されます。Exceptionで終了せず、正常にメソッドが終了した場合、コミットが実行されます。

 次ページでは、トランザクション管理の仕組みや便利な自動生成ツール「S2JDBC-Gen」について説明します。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。