EntityとDaoの利用「Main.java」
それでは、作成したDaoとEntityでデータベースの操作をしてみましょう。
BookDaoの取得
まず最初にDaoを取得する必要があります。BookDao
を取得するには、次のように記述します。
S2Container container =
S2ContainerFactory.create("wings/dao/BookDao.dicon");
BookDao bookDao = (BookDao)container.getComponent(BookDao.class);
ここでは、SeasarからBookDao
クラスを取得しています。1~2行目では設定ファイルの「BookDao.dicon」を読み込み、3行目ではBookDao
クラスを取得しています。
INSERTの実行
それではデータを挿入してみましょう。EntityのBook
クラスに値を設定した後で、BookDao
に定義したinsert
メソッドを呼び出します。
Book book = new Book(); book.setId(100); book.setTitle("初めてのS2Dao"); book.setPrice(2000); book.setEditdate(new Date()); bookDao.insert(book);
このinsert
メソッドを実行すると、次のログが表示されます。
INSERT INTO BOOK (id, price, editday, title) VALUES (100, 2000, '2006-01-23', '初めてのS2Dao')
このように実行したSQLがログとしてコンソールに表示されます。このログにはPrepareStatementのように「?」がないため、もし問題があったとしても、そのままコピーしてSQLを投げることができるのでデバッグ時には大変便利です。
UPDATEの実行
データを更新するには、BookDao
のupdate
メソッドを呼び出します。この例では、データのタイトルや価格を、UPDATE文にて更新しています。
book.setTitle("S2Dao応用");
book.setPrice(3000);
bookDao.update(book);
SELECTの実行
データを取得するには、BookDao
のgetAll
メソッドを呼び出します。BookDao
のgetAll
メソッドでは、java.util.List
型にてEntityのリストが取得できるため、for文とIteratorを使って、Book
クラスの値を取得しています。
List books = bookDao.getAll(); for (Iterator iter = books.iterator(); iter.hasNext();) { book = (Book) iter.next(); System.out.println("■タイトル:" + book.getTitle() + " ■価格:" + book.getPrice()); }
DELETEの実行
最後にデータを削除してみましょう。データを削除するには、削除するデータのID(キー)を設定し、delete
メソッドを呼び出します。
book.setId(100); bookDao.delete(book);
以上、S2Daoを使った簡単な「追加・更新・参照・削除」の方法を確認しました。
外部SQLの利用
引き続き、外部SQLを利用してみましょう。S2Daoでは、外部SQLを利用することで集計関数を用いたり、高度な条件のSQLを実行できたりします。外部SQLを利用するには、「Daoとメソッドの名前」が付いたSQLファイルを用意し、Daoにメソッドを定義します。
ここでは、2つのSQLファイルと2つのメソッドを追加します。
簡単な例(集計関数の使用)
まずは、書籍の値段の平均値を求めるSQLを利用する例を見てみましょう。テキストファイルにSQLを書いて、「BookDao_getAvgPrice.sql」という名前でBookDao
と同じフォルダに保存します。
SELECT AVG(price) FROM book
そして、BookDao
にgetAvgPrice
メソッドを定義します。
public int getAvgPrice();
このgetAvgPrice
メソッドを呼び出すと、インターフェース(BookDao
)とメソッド(getAveragePrice
)をアンダーバーでつないだSQLファイル「BookDao_insertRecord.sql」がS2Daoによって自動的に呼び出されます。
System.out.println("■平均価格は:" + bookDao.getAvgPrice());
このように、Daoにメソッドを定義し、メソッドの名前がついたSQLファイルを配置することで、簡単に外部SQLを呼び出すことができます。
SQLコメントによるバインド変数の使用(LIKEの使用)
先ほどのSQLは固定の文字列でしたが、実際のアプリケーションではバインド変数というパラメータを使うことが多いと思います。ここでは、本のタイトルに特定の文字が含まれているかをlike検索してみましょう。
まず、先ほどと同じ手順で「BookDao_getByTitle.sql」という名前のSQLファイルを作成します。
SELECT * FROM book WHERE title LIKE /*book.title*/'%S2Dao%'
ここでは/*book.title*/
というSQLのコメントに注目しておいてください。
引き続き、BookDao
にgetByTitle
というメソッドを定義し、引数にBook
クラスを指定します。
public List getByTitle(Book book);
EntityにLike句の条件を設定してから、getByTitle
メソッドを呼び出して、like検索を行います。
book.setTitle("%応用%");
books = bookDao.getByTitle(book);
このgetByTitle
メソッドを呼び出すと、SQLファイルの「WHERE title LIKE /*book.title*/'%S2Dao%'
」が「WHERE title LIKE '%応用%'
」として実行されます。これはS2Daoによって、SQLのコメントと直後の定数「/*book.title*/'%S2Dao%'
」が、getByTitle
メソッドの引数「book
のtitle
プロパティ」で置換されているためです。この機能は「SQLコメント」と呼ばれ、PreparedStatementの「?」の代わりにSQLのコメントを使用することができます。なお、このSQLは「SQL Plus」や「DatabaseManager」といったツールからそのまま実行できるといったメリットもあります。
getByTitle
メソッドの引数が1つのため省略して記述していません)。S2Daoの詳細な仕様についてはマニュアルや、S2Daoのホームページからダウンロードできるソースコードに添付しているexampleを参考にしてください。
まとめ
S2Daoを用いたプログラミング方法について整理します。
- EntityクラスとDaoインターフェースを用意する。
- Entityには基本的なGetterとSetterを記述する。
- マッピングファイルの代わりにクラスの定数でマッピングを定義する。
- DaoインターフェースにINSERT/UPDATE/DELETE/SELECT用のメソッドを定義する。
- 外部SQLファイルを利用する場合は、インターフェース名とメソッド名に対応したSQLファイルを作成する。
- 外部SQLファイルはSQLコメントを使うことで、バインド変数の使用が可能になる。
S2Daoは、冗長なコーディングが少なく、外部のSQLを容易に使えることから高い生産性と保守性を兼ね備えています。また、JDBCのAPIの知識が不要で、データベースプログラマとJavaプログラマの分業も容易です。もし今後の開発でO/Rマッピングツールを選定するときにはS2Daoも検討してみてはいかがでしょうか。
補足
本稿で紹介した以外にもS2Daoは多くの便利な機能を持っています。紹介できなかった機能を下表に簡単に整理します。
S2Daoの機能 | 説明 |
IDの自動生成 | ID(プライマリーキー)をRDBMSに自動生成 |
N:1マッピング | 複数テーブルのマッピング |
複数DBMS対応 | 使用するSQLファイルをデータベースごとに指定 |
IFコメント | 外部SQLファイルのSQLコメントで条件分岐 |
排他制御 | テーブルに排他制御用のカラムを用意して自動制御 |
EntityManager | SELECT文にWHERE句やORDER BY句を動的に追加する機能 |
2SDaoTestCase | SELECT文の結果をExcelで簡単にテストできる機能 |
これらの機能の詳細については、次の参考資料のリンクをご覧ください。また、自動トランザクションなどS2Daoの詳細を理解したい場合には、Seasarについても理解すると良いでしょう。
参考資料
- S2Daoプロジェクト
- @IT 『SeasarのO/RマッピングツールS2Dao』 沖林正紀 著、2005年12月
- ThinkIT 『Eclipse3ではじめるJava Webアプリケーション開発 第9回:O/Rマッパーの利用』 宮本信二 著、2005年3月
- オブジェクト倶楽部 『S2DaoとS2Unitでテストを見える化』 太田@オブジェクト指向実践者の集い 著、2004年12月
- IT Pro 『開発現場から時代を眺める 第5回:動的言語と静的言語の交差点──RubyとJava/Seasar2の出会い』 arton 著、2005年5月
- Seasarプロジェクト
- Seasar-userメーリングリスト
- S2Dao.NET
- S2Dao.PHP5
- HSQLDBの使い方