特集ASP.NETで実践するO/Rマッピング(iBATIS.NET編)山田 祥寛(http://www.wings.msn.to/)2005/10/08 |
|
|
iBATIS.NET経由でデータベースを検索する
以上で、iBATIS.NETを利用するための準備は完了だ。それでは、いよいよiBATIS.NET経由でデータベースにアクセスしてみよう。
以下のWebフォームは、前回同様、[出版社]欄に入力されたキーワードでbooksテーブルを検索し、取得した結果をDataGridコントロール上に一覧表示するサンプルだ。まずは具体的なコードを眺めてみよう。
|
||
iBATIS.NETを利用してデータベース検索を行うサンプル・プログラム | ||
(上:C#版「ibatis_cs.aspx」、下:VB.NET版「ibatis_vb.aspx」) |
iBATIS.NETでデータベース・アクセスの中核を担うのは、SqlMapperクラス(IBatisNet.DataMapper名前空間)の役割だ。SqlMapperクラスは、静的メソッドであるMapper.Instanceメソッドを介して取得できる。また、MapperクラスはsqlMap.configによって定義されたマッピング情報にアクセスするためのクラスである。
SqlMapperクラスのインスタンスを取得したら、後はカンタン。SqlMapper.QueryForListメソッドを利用して、マッピング・ファイル上で定義されたSQLクエリを呼び出せばよいだけだ。QueryForListメソッドの一般的な構文は以下のとおり。
|
|
SqlMapperクラスのQueryForListメソッドの構文(C#) |
パラメータstatementNameには、先ほど<select>要素のid属性で定義したSQLクエリ名を、パラメータparameterObjectにはプレイスホルダにセットするパラメータ値を、それぞれセットする。取得する開始行や最大取得行を指定したい場合には、第3、第4パラメータにそれぞれ明示することも可能だ。
このようにiBATIS.NETを利用することで、データベースへの接続情報やSQLクエリを外部化し、かつ、取得した結果を特別なマッピング・コードを記述することなく、オブジェクトにマッピングできるというわけだ。
以上を理解したら、さっそくサンプルを動作させてみよう。前回のNHibernate編で紹介したサンプルと同様の結果が得られるはずだ。
■iBATIS.NETが提供する「ダイナミックSQL」
このように、iBATIS.NETを利用することで、データベース連携のコードをシンプルに記述できる。しかし、iBATIS.NETの魅力はこれだけではない。iBATIS.NETには動的にSQLクエリを生成する「ダイナミックSQL」と呼ばれる、非常に便利な機能が用意されている。
ダイナミックSQLとは、例えば条件式に与えるパラメータの状態によって、動的に条件式を差し替える機能のことだ。まずは、以下の例をご覧いただきたい。
|
|
ダイナミックSQLを利用するためのマッピング・ファイルの設定(Book.xml(抜粋)) |
|
|
ダイナミックSQLによるデータベース検索(C#の例:ibatis_cs2.aspx(抜粋)) |
これは、先ほどのibatis_cs.aspxをダイナミックSQLで置き換えたものである。ibatis_cs.aspxの場合では、検索条件として[出版社]欄を指定しなかったときには空のデータグリッドが表示されたはずだ。これは、publishフィールドが空文字列のレコードを検索しようとしたためである。
しかし、上の設定とコードで[出版社]欄を空白にして検索を行った場合、すべての書籍情報が表示される。これがダイナミックSQLの機能だ。ダイナミックSQLは、<dynamic>要素の配下に記述された条件がtrueであるかどうかによって、動的に条件句を追加する機能である。
この設定では、Book.Publishプロパティの値が空(Empty)でない場合にのみ、「WHERE publish='*****'」といった条件句をSQLクエリに追加する。prepend属性は、追加する条件句の前に付加するキーワードを指定するもので、ここでは「WHERE」を付加する。
ユーザーの入力値によって、動的にSQLクエリを変更したいというケースはままあるが、そのような場合にもダイナミックSQLの機能を利用することで、よりシンプルにSQLクエリを組み立てることができるというわけだ。
ちなみに、<dynamic>要素の配下で利用可能な主な条件要素としては、以下の表のようなものが用意されている。
要素 | SQLクエリが付加される条件 |
isEqual | property属性の値がcompareValue属性の値と等しい場合 |
isNotEqual | property属性の値がcompareValue属性の値と等しくない場合 |
isGreaterThan | property属性の値がcompareValue属性の値より大きい場合 |
isGreaterEqual | property属性の値がcompareValue属性の値以上である場合 |
isLessThan | property属性の値がcompareValue属性の値より小さい場合 |
isLessEqual | property属性の値がcompareValue属性の値未満である場合 |
isNull | property属性の値がnullである場合 |
isNotNull | property属性の値がnullでない場合 |
isEmpty | property属性の値が空である場合 |
isNotEmpty | property属性の値が空でない場合 |
<dynamic>要素配下で記述可能な主な条件要素 |
INDEX | ||
[特集] ASP.NETで実践するO/Rマッピング(iBATIS.NET編) | ||
1.iBATIS.NETのインストールと環境設定 | ||
2. iBATIS.NET経由でデータベースを検索する | ||
3. iBATIS.NETによるデータ登録 | ||
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|