SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

S2DaoでXMLレスなO/Rマッピングを行う

S2Daoを用いてパフォーマンス・保守性の高いDaoを構築する


  • X ポスト
  • このエントリーをはてなブックマークに追加

EntityとDaoの利用「Main.java」

 それでは、作成したDaoとEntityでデータベースの操作をしてみましょう。

BookDaoの取得

 まず最初にDaoを取得する必要があります。BookDaoを取得するには、次のように記述します。

Main.java(DaoとEntityを利用するコード)抜粋
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メソッドを呼び出します。

「Main.java」抜粋
Book book = new Book();
book.setId(100);
book.setTitle("初めてのS2Dao");
book.setPrice(2000);
book.setEditdate(new Date());
bookDao.insert(book);

 このinsertメソッドを実行すると、次のログが表示されます。

INSERT文のSQL
INSERT INTO BOOK (id, price, editday, title)
    VALUES (100, 2000, '2006-01-23', '初めてのS2Dao')

 このように実行したSQLがログとしてコンソールに表示されます。このログにはPrepareStatementのように「?」がないため、もし問題があったとしても、そのままコピーしてSQLを投げることができるのでデバッグ時には大変便利です。

UPDATEの実行

 データを更新するには、BookDaoupdateメソッドを呼び出します。この例では、データのタイトルや価格を、UPDATE文にて更新しています。

「Main.java」抜粋
book.setTitle("S2Dao応用");
book.setPrice(3000);
bookDao.update(book);

SELECTの実行

 データを取得するには、BookDaogetAllメソッドを呼び出します。BookDaogetAllメソッドでは、java.util.List型にてEntityのリストが取得できるため、for文とIteratorを使って、Bookクラスの値を取得しています。

「Main.java」抜粋
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メソッドを呼び出します。

「Main.java」抜粋
book.setId(100);
bookDao.delete(book);

 以上、S2Daoを使った簡単な「追加・更新・参照・削除」の方法を確認しました。

外部SQLの利用

 引き続き、外部SQLを利用してみましょう。S2Daoでは、外部SQLを利用することで集計関数を用いたり、高度な条件のSQLを実行できたりします。外部SQLを利用するには、「Daoとメソッドの名前」が付いたSQLファイルを用意し、Daoにメソッドを定義します。

外部SQLファイルの利用
外部SQLファイルの利用

 ここでは、2つのSQLファイルと2つのメソッドを追加します。

簡単な例(集計関数の使用)

 まずは、書籍の値段の平均値を求めるSQLを利用する例を見てみましょう。テキストファイルにSQLを書いて、「BookDao_getAvgPrice.sql」という名前でBookDaoと同じフォルダに保存します。

BookDao_getAvgPrice.sql
SELECT AVG(price) FROM book

 そして、BookDaogetAvgPriceメソッドを定義します。

「BookDao.java」抜粋
public int getAvgPrice();

 このgetAvgPriceメソッドを呼び出すと、インターフェース(BookDao)とメソッド(getAveragePrice)をアンダーバーでつないだSQLファイル「BookDao_insertRecord.sql」がS2Daoによって自動的に呼び出されます。

「Main.java」抜粋
System.out.println("■平均価格は:" +  bookDao.getAvgPrice());

 このように、Daoにメソッドを定義し、メソッドの名前がついたSQLファイルを配置することで、簡単に外部SQLを呼び出すことができます。

SQLコメントによるバインド変数の使用(LIKEの使用)

 先ほどのSQLは固定の文字列でしたが、実際のアプリケーションではバインド変数というパラメータを使うことが多いと思います。ここでは、本のタイトルに特定の文字が含まれているかをlike検索してみましょう。

 まず、先ほどと同じ手順で「BookDao_getByTitle.sql」という名前のSQLファイルを作成します。

BookDao_getByTitle.sql
SELECT * FROM book
WHERE title LIKE /*book.title*/'%S2Dao%'

 ここでは/*book.title*/というSQLのコメントに注目しておいてください。

 引き続き、BookDaogetByTitleというメソッドを定義し、引数にBookクラスを指定します。

「BookDao.java」抜粋
public List getByTitle(Book book);

 EntityにLike句の条件を設定してから、getByTitleメソッドを呼び出して、like検索を行います。

「Main.java」抜粋
book.setTitle("%応用%");
books = bookDao.getByTitle(book);

 このgetByTitleメソッドを呼び出すと、SQLファイルの「WHERE title LIKE /*book.title*/'%S2Dao%'」が「WHERE title LIKE '%応用%'」として実行されます。これはS2Daoによって、SQLのコメントと直後の定数「/*book.title*/'%S2Dao%'」が、getByTitleメソッドの引数「booktitleプロパティ」で置換されているためです。この機能は「SQLコメント」と呼ばれ、PreparedStatementの「?」の代わりにSQLのコメントを使用することができます。なお、このSQLは「SQL Plus」や「DatabaseManager」といったツールからそのまま実行できるといったメリットもあります。

参考:ARGSアノテーション
 通常、メソッドの引数とSQL文を関連づける場合にはARGSアノテーションを使用します(このサンプルでは、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コメントで条件分岐
排他制御テーブルに排他制御用のカラムを用意して自動制御
EntityManagerSELECT文にWHERE句やORDER BY句を動的に追加する機能
2SDaoTestCaseSELECT文の結果をExcelで簡単にテストできる機能

 これらの機能の詳細については、次の参考資料のリンクをご覧ください。また、自動トランザクションなどS2Daoの詳細を理解したい場合には、Seasarについても理解すると良いでしょう。

参考資料

  1. S2Daoプロジェクト
  2. @IT 『SeasarのO/RマッピングツールS2Dao』 沖林正紀 著、2005年12月
  3. ThinkIT 『Eclipse3ではじめるJava Webアプリケーション開発 第9回:O/Rマッパーの利用』 宮本信二 著、2005年3月
  4. オブジェクト倶楽部 『S2DaoとS2Unitでテストを見える化』 太田@オブジェクト指向実践者の集い 著、2004年12月
  5. IT Pro 『開発現場から時代を眺める 第5回:動的言語と静的言語の交差点──RubyとJava/Seasar2の出会い』 arton 著、2005年5月
  6. Seasarプロジェクト
  7. Seasar-userメーリングリスト
  8. S2Dao.NET
  9. S2Dao.PHP5
  10. HSQLDBの使い方

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 青木 淳夫(アオキ アツオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/303 2006/12/22 18:44

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング