SHOEISHA iD

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

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

特集記事

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

S2Dao.NETを用いて生産性・パフォーマンスの高いDaoを構築する


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

(3)設定ファイルを作る「Dao.dicon」

 最後に、S2Dao.NETを使うためにDaoのインターフェイス名を登録します。ここでは「Dao.dicon」という名前の設定ファイルに追記します。

Dao.dicon
<components>

    (中略)

    <!-- 書籍Dao -->
    <component class="S2DaoSample.Dao.IBookDao">
        <aspect>DaoInterceptor</aspect>
    </component>
    <!-- 他のDaoがあれば -->
    <!--<component class="S2DaoSample.Dao.IHogeDao">
        <aspect>DaoInterceptor</aspect>
    </component>-->

</components>

 O/Rマッピングを実行するには、上のコードのようにDaoインターフェイスを登録する必要があります。これは、S2Dao.NETが内部でS2Container.NETというフレームワークを利用しているためです(「*.dicon」はS2Container.NETの設定ファイルです)。この設定をすることによって、「IBookDao.cs」でデータベースの更新や参照ができるようになります。S2Container.NETの詳細については、別稿『S2Container.NETのDIとAOPを活用し生産性の高いシステムを構築する』を参照してください。ここでは、<aspect>DaoInterceptor</aspect>という記述によって、Daoとしての機能がIBookDaoインターフェイスに織り込まれるということを理解して頂ければ結構です。

 以上で、準備は完了です。

(4)EntityとDaoの利用「Program.cs」

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

IBookDao.csの取得

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

Program.cs(DaoとEntityを利用するコード)抜粋
//S2Containerを初期化
IS2Container container = S2ContainerFactory.
                         Create("S2DaoSample.Dicon.Dao.dicon");
//BookDaoを取得
IBookDao bookDao = (IBookDao)container.GetComponent(typeof(IBookDao));

 ここでは、S2Container.NETからIBookDao.csクラスを取得しています。設定ファイルの「Dao.dicon」を読み込み、IBookDao.csクラスを取得しています。

INSERTの実行

 それではデータを挿入してみましょう。EntityのBookクラスに値を設定した後で、IBookDao.csに定義したInsertメソッドを呼び出します。

「Program.cs」抜粋
Book book = new Book();
book.Id = 100;
book.Title = "初めてのS2Dao.NET";
book.Price = 2000;
book.Editdate = DateTime.Today;
int retCnt = bookDao.Insert(book);
logger.Info(retCnt + "件挿入しました");

 このInsertメソッドを実行すると、実行したSQLと、ログがコンソールに表示されます

INSERT文のSQL
DEBUG [15:43:48] INSERT INTO Book (EDIT_DATE, ID, PRICE, TITLE)
                 VALUES ('2006-12-18', 100, 2000, '初めてのS2Dao.NET')
INFO  [15:43:48] 1件挿入しました

 loggerはコンソールにメッセージを出力するlog4netのオブジェクト変数です。INFOから始まる行は明示的に出力したログで、DEBUGから始まる行はS2Dao.NETが自動的に出力したログです。S2Dao.NETが出力したログにはプレースホルダの「?」がないため、もし問題があったとしても、そのままコピーしてSQLを投げることができるためデバッグ時に便利です。

UPDATEの実行

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

「Program.cs」抜粋
book.Title = "応用S2Dao.NET";
book.Price = 3000;
retCnt = bookDao.Update(book);
logger.Info(retCnt + "件更新しました");

SELECTの実行

 データを取得するには、IBookDao.csGetAllBookGetAvgPriceGetByTitleGetBetweenPriceメソッドを呼び出します。

「Program.cs」抜粋
//SELECT (書籍を複数件 選択)
Array books = bookDao.GetAllBook();
foreach (Book bk in books) {
    logger.Info(bk.Id + "\t" + bk.Title + "(" + bk.Price + "円)");
}

//SELECT (平均価格の取得)
logger.Info("平均価格:" + bookDao.GetAvgPrice() + "円");

//SELECT (複数件 LIKE条件選択)
book.Title = "%応用%";
books = bookDao.GetByTitle(book);
foreach (Book bk in books) {
    logger.Info(bk.Id + "\t" + bk.Title + "(" + bk.Price + "円)");
}

//SELECT (複数件 BETWEEN条件選択)
books = bookDao.GetBetweenPrice(2000,3000);
foreach (Book bk in books) {
    logger.Info(bk.Id + "\t" + bk.Title + "(" + bk.Price + "円)");
}

 GetAllBookGetByTitleGetBetweenPriceメソッドでは、Bookクラスの配列が取得できるため、foreach文を使って、Bookクラスの値を取得しています。

DELETEの実行

 最後にデータを削除してみましょう。データを削除するには、削除するデータのID(キー)を設定し、Deleteメソッドを呼び出します。

「Program.cs」抜粋
book.Id = 100;
retCnt = bookDao.Delete(book);
logger.Info(retCnt + "件削除しました");

Program.csの実行結果

 これら「追加/更新/参照/削除」のコードを実行すると、コマンドプロンプトに次のような実行結果が表示されます。

サンプルの実行結果
INFO  [15:43:47] ---▼IBookDao.csを取得---
INFO  [15:43:47] ---▼INSERT---
DEBUG [15:43:48] INSERT INTO Book (EDIT_DATE, ID, PRICE, TITLE)
                 VALUES ('2006-12-18', 100, 2000, '初めてのS2Dao.NET')
INFO  [15:43:48] 1件挿入しました
INFO  [15:43:48] ---▼UPDATE---
DEBUG [15:43:48] UPDATE Book SET EDIT_DATE = '2006-12-18',
                 PRICE = 3000, TITLE = '応用S2Dao.NET' WHERE ID = 100
INFO  [15:43:48] 1件更新しました
INFO  [15:43:48] ---▼SELECT(書籍を複数件 選択)---
DEBUG [15:43:48] SELECT Book.EDIT_DATE, Book.ID, Book.PRICE, Book.TITLE
                 FROM Book
INFO  [15:43:48] 1      C#応用(3000円)
INFO  [15:43:48] 2      ASP.NET入門(2000円)
INFO  [15:43:48] 3      アジャイル開発のすべて(4000円)
INFO  [15:43:48] 100    応用S2Dao.NET(3000円)
INFO  [15:43:48] ---▼SELECT(平均価格の取得)---
DEBUG [15:43:48] SELECT AVG(price) FROM book
INFO  [15:43:48] 平均価格:3000円
INFO  [15:43:48] ---▼SELECT(複数件 LIKE条件選択)---
DEBUG [15:43:48] SELECT Book.EDIT_DATE, Book.ID, Book.PRICE, Book.TITLE
                 FROM Book WHERE title LIKE '%応用%'
INFO  [15:43:48] 1      C#応用(3000円)
INFO  [15:43:48] 100    応用S2Dao.NET(3000円)
INFO  [15:43:49] ---▼SELECT(複数件 BETWEEN条件選択)---
DEBUG [15:43:49]
SELECT ID, PRICE, TITLE FROM BOOK
WHERE PRICE BETWEEN 2000 AND 3000
INFO  [15:43:49] 1      C#応用(3000円)
INFO  [15:43:49] 2      ASP.NET入門(2000円)
INFO  [15:43:49] 100    応用S2Dao.NET(3000円)
INFO  [15:43:50] ---▼DELETE---
DEBUG [15:43:50] DELETE FROM Book WHERE ID = 100
INFO  [15:43:50] 1件削除しました
INFO  [15:43:50] 完了です

 以上、S2Dao.NETを使った簡単なサンプルの動作を確認しました。

まとめ

 最後に、S2Dao.NETを用いたプログラミング方法について整理します。

  • EntityクラスとDaoインターフェイスを用意する。
  • データを表すEntityクラスを記述する。
  • DaoインターフェイスにINSERTUPDATEDELETESELECT用のメソッドを定義する。
  • 特別な設定があれば属性を使って定義する。
  • S2Container.NETを使ってDaoインターフェースを取得して、データを操作する。

 S2Dao.NETは、冗長なコーディングが少なく、外部のSQLを容易に使えることから高い生産性と保守性を兼ね備えています。本稿のサンプルはシンプルなコンソールアプリケーションでしたが、S2Container.NETと組み合わせれば、N層から構成される自動トランザクションアプリケーションを構築でき、S2Windows.NETと組み合わせればWindowsアプリケーションを効率的に開発できます。また、テーブル定義を読み込み、C#のソースコードを自動生成するDBFluteというツールも開発中です。もし、今後の開発でO/Rマッピングライブラリを選定するときにはS2Dao.NETも検討してみてはいかがでしょうか。

参考資料

  1. S2Dao.NET プロジェクトサイト
  2. S2Container.NET/S2Dao.NET利用メーリングリスト
  3. S2Container.NET(s2dotnet) プロジェクトサイト
  4. S2Daoの利用をサポートするツール DBFlute
  5. セッション資料(2006秋) Seasar.NETプロダクトによるWindowsアプリケーション開発
  6. S2Container.NET/S2Dao.NET/S2Windows.NETによるサンプルコードと解説

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

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

もっと読む

この記事の著者

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

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング