(3)設定ファイルを作る「Dao.dicon」
最後に、S2Dao.NETを使うためにDaoのインターフェイス名を登録します。ここでは「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」を取得するには、次のように記述します。
//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
メソッドを呼び出します。
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と、ログがコンソールに表示されます
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.cs
のUpdate
メソッドを呼び出します。この例では、データのタイトルや価格を、UPDATE文にて更新しています。
book.Title = "応用S2Dao.NET"; book.Price = 3000; retCnt = bookDao.Update(book); logger.Info(retCnt + "件更新しました");
SELECTの実行
データを取得するには、IBookDao.cs
のGetAllBook
/GetAvgPrice
/GetByTitle
/GetBetweenPrice
メソッドを呼び出します。
//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 + "円)"); }
GetAllBook
/GetByTitle
/GetBetweenPrice
メソッドでは、Book
クラスの配列が取得できるため、foreach文を使って、Book
クラスの値を取得しています。
DELETEの実行
最後にデータを削除してみましょう。データを削除するには、削除するデータのID(キー)を設定し、Delete
メソッドを呼び出します。
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インターフェイスに
INSERT
/UPDATE
/DELETE
/SELECT
用のメソッドを定義する。 - 特別な設定があれば属性を使って定義する。
- S2Container.NETを使ってDaoインターフェースを取得して、データを操作する。
S2Dao.NETは、冗長なコーディングが少なく、外部のSQLを容易に使えることから高い生産性と保守性を兼ね備えています。本稿のサンプルはシンプルなコンソールアプリケーションでしたが、S2Container.NETと組み合わせれば、N層から構成される自動トランザクションアプリケーションを構築でき、S2Windows.NETと組み合わせればWindowsアプリケーションを効率的に開発できます。また、テーブル定義を読み込み、C#のソースコードを自動生成するDBFluteというツールも開発中です。もし、今後の開発でO/Rマッピングライブラリを選定するときにはS2Dao.NETも検討してみてはいかがでしょうか。