特集

ASP.NETで実践するO/Rマッピング(iBATIS.NET編)

山田 祥寛(http://www.wings.msn.to/
2005/10/08

Page1 Page2 Page3

iBATIS.NET経由でデータベースを検索する

 以上で、iBATIS.NETを利用するための準備は完了だ。それでは、いよいよiBATIS.NET経由でデータベースにアクセスしてみよう。

 以下のWebフォームは、前回同様、[出版社]欄に入力されたキーワードでbooksテーブルを検索し、取得した結果をDataGridコントロール上に一覧表示するサンプルだ。まずは具体的なコードを眺めてみよう。

<%@ Page ContentType="text/html" Language="C#" debug="true" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="IBatisNet.DataMapper" %>
<%@ Import Namespace="Com.Msn.Wings" %>
<script runat="Server">

IList books=null;

// [検索]ボタンをクリックしたタイミングで実行
public void btnSrch_Click(Object sender, EventArgs e){

  // マッピング・ファイルから該当するSQLクエリを取得し、発行。
  // 取得したBookクラスのリスト(IListオブジェクト)をDataGrid
  // コントロールにバインドする
  books = Mapper.Instance().QueryForList("getBooksInfo", txtSrch.Text);
  grid.DataBind();
}

</script>
<html>
<head>
<title>iBATIS.NETによるデータ・アクセス</title>
</head>
<body>
<form runat="Server">
  出版社:
  <asp:TextBox id="txtSrch" runat="Server" />
  <asp:Button id="btnSrch" runat="Server"
    Text="検索" OnClick="btnSrch_Click" />
  <br />

  <asp:DataGrid id="grid" runat="Server"
    DataSource="<%# books %>" AutoGenerateColumns="False"
    DataKeyField="isbn">

    <HeaderStyle BackColor="#BB2255" ForeColor="white"
      HorizontalAlign="Center" Font-Bold="True" />
    <ItemStyle BackColor="#FFeeEE" />
    <AlternatingItemStyle BackColor="#FFDDDD" />

    <Columns>
      <asp:BoundColumn DataField="Isbn" HeaderText="ISBNコード"
        ReadOnly="True" />
      <asp:BoundColumn DataField="Title" HeaderText="書名" />
      <asp:BoundColumn DataField="Price" HeaderText="価格"
        DataFormatString="{0:#,###円}" />
      <asp:BoundColumn DataField="Publish" HeaderText="出版社" />
      <asp:BoundColumn DataField="Published" HeaderText="配本日"
        DataFormatString="{0:yyyy年MM月dd日(ddd)}" />
    </Columns>

  </asp:DataGrid>
</form>
</body>
</html>
<%@ Page ContentType="text/html" Language="VB" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="IBatisNet.DataMapper" %>
<%@ Import Namespace="Com.Msn.Wings" %>
<script runat="Server">

Dim books As IList

' [検索]ボタンをクリックしたタイミングで実行
Public Sub btnSrch_Click(sender As Object, e As EventArgs)

  ' マッピング・ファイルから該当するSQLクエリを取得し、発行。
  ' 取得したBookクラスのリスト(IListオブジェクト)をDataGrid
  ' コントロールにバインドする
  books = Mapper.Instance().QueryForList("getBooksInfo", txtSrch.Text)
  grid.DataBind()
End Sub

</script>
<html>
<head>
<title>iBATIS.NETによるデータ・アクセス</title>
</head>
<body>
<form runat="Server">
  出版社:
  <asp:TextBox id="txtSrch" runat="Server" />
  <asp:Button id="btnSrch" runat="Server"
    Text="検索" OnClick="btnSrch_Click" />
  <br />

  <asp:DataGrid id="grid" runat="Server"
    DataSource="<%# books %>" AutoGenerateColumns="False"
    DataKeyField="isbn">

    <HeaderStyle BackColor="#BB2255" ForeColor="white"
      HorizontalAlign="Center" Font-Bold="True" />
    <ItemStyle BackColor="#FFeeEE" />
    <AlternatingItemStyle BackColor="#FFDDDD" />

    <Columns>
      <asp:BoundColumn DataField="Isbn" HeaderText="ISBNコード"
        ReadOnly="True" />
      <asp:BoundColumn DataField="Title" HeaderText="書名" />
      <asp:BoundColumn DataField="Price" HeaderText="価格"
        DataFormatString="{0:#,###円}" />
      <asp:BoundColumn DataField="Publish" HeaderText="出版社" />
      <asp:BoundColumn DataField="Published" HeaderText="配本日"
        DataFormatString="{0:yyyy年MM月dd日(ddd)}" />
    </Columns>

  </asp:DataGrid>

</form>
</body>
</html>
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メソッドの一般的な構文は以下のとおり。

public IList QueryForList(string statementName, object parameterObject)
public IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults)
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とは、例えば条件式に与えるパラメータの状態によって、動的に条件式を差し替える機能のことだ。まずは、以下の例をご覧いただきたい。

<select id="getBooksInfo2" resultMap="booksResult">
  SELECT isbn,title,price,publish,published FROM books
  <dynamic prepend="WHERE">
    <isNotEmpty prepend="AND" property="Publish">
      publish=#Publish#
    </isNotEmpty>
  </dynamic>
</select>
ダイナミックSQLを利用するためのマッピング・ファイルの設定(Book.xml(抜粋))
 
IList books = null;

public void btnSrch_Click(Object sender, EventArgs e) {
  Book book = new Book();
  book.Publish = txtSrch.Text;
  books = Mapper.Instance().QueryForList("getBooksInfo2", book);
  grid.DataBind();
}
ダイナミック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によるデータ登録
 


Insider.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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間