Seasar DI Container with AOP
S2Dao.NET TOPページへ

S2Dao.NET - S2Pager

S2Dao.NETを使用してページング機能を実現する機能です。S2Daoで検索した結果に対して、開始位置と最大結果件数を指定して 結果の一部のみを取得できます。

使い方

S2Pagerを使用するには次の手順に従ってください。

  1. ページングの方法の選択
  2. 検索条件の設定方法

ページングの方法の選択

ページングの方法を選択します。DBMSごとにページングの方法が異なります。 次の手順を参考にしてAdo.diconの設定を変更してください。

検索条件の設定方法

S2Pagerに対して、検索結果を取得する開始位置と最大結果件数を指定するには、次の方法があります。

検索条件DTO

このDTOは、Seasar.Dao.Pager.IPagerConditionインターフェースを実装する必要があります (既定クラスとしてSeasar.Dao.Pager.DefaultPagerConditionクラスを用意しています)。

DTOには、S2Pager用のプロパティ(Offset、Limit、Count)とWHERE句に含まる検索条件となるプロパティを保持してください。次のコードはDTOの作成例です。

public class CategoryPagerCondition : DefaultPagerCondition
{
	private string _category;

	public string Category
	{
		get { return _category; }
		set { _category = value; }
	}
}

次にDaoのメソッドを定義します。上記で作成したDTOをパラメータとして受け取るメソッドをDaoに定義します。次のコードはDaoの作成例です。

[Bean(typeof(Employee))]
public interface IEmployeeDao
{
	[Query("ORDER BY EMPNO")]
	IList GetEmployeesByCategory(CategoryPagerCondition condition);
}

開始位置(Limit)と最大取得数(Offset)をセットしてDaoのメソッドを呼び出します。次のコードはDaoのメソッドの呼び出し例です。

CategoryPagerCondition condition = new CategoryPagerCondition();
condition.Limit = 10;
condition.Offset = 20;
condition.Category = ".NET";
IList employees = _employeeDao.GetEmployees(condition);

検索条件属性

DaoのメソッドにSeasar.Dao.Pager.PagerAttribute属性を指定することで、 検索条件DTOの代わりに使用することが可能です。

PagerAttribute属性の引数には、S2Pager用のプロパティ(Limit、Offset、Count)に対応した引数の名前を指定します。 PagerAttribute属性の引数を省略した場合、既定の引数の名前(limit、offset、count)を使用します。 開始位置(limit)と最大取得数(offset)の引数の型は、int型を指定します。 結果件数(count)の引数の型は、int型とoutキーワード(VB.NETの場合、ByRefキーワード)を指定します。 次のコードはPagerAttribute属性の使用例です。

[Bean(typeof(Employee))]
public interface IEmployeeDao
{
    [Query("ORDER BY EMPNO")]
    [Pager]
    IList GetEmployeesPager(int limit, int offset, out int count);

    [Query("ORDER BY EMPNO")]
    [Pager("l", "o", "c")]
    IList GetEmployeesPager2(int l, int o, out int c);

    [Query("DEPTNO = /*deptNo*/ ORDER BY EMPNO")]
    [Pager]
    IList GetEmployeesPager3(int deptNo, int limit, int offset, out int count);
}

開始位置(limit)と最大取得数(offset)をセットしてDaoのメソッドを呼び出します。 呼び出すと結果件数(count)に値がセットされます。 次のコードはDaoのメソッドの呼び出し例です。

int count;
IList employees = _employeeDao.GetEmployeesPager(2, 1, out count);

ページングの方法

使用するページングの方法ごとに、Ado.diconを変更する必要があります。

ROW_NUMBERを使用する方法(SQL Server 2005の場合)

SQL Server 2005のROW_NUMBER()関数を使用する方法です。ROW_NUMBER()関数で使うORDER BY句を必ず指定する必要があります。

この設定を有効にするには、Ado.diconを次の設定に変更してください。

(変更前)
<component name="commandFactory"
           class="Seasar.Extension.ADO.Impl.BasicCommandFactory" />
<component name="dataReaderFactory"
           class="Seasar.Extension.ADO.Impl.BasicDataReaderFactory" />
(変更後)
<component name="commandFactory"
           class="Seasar.Extension.ADO.Impl.BasicCommandFactory" />
<component name="dataReaderFactory"
           class="Seasar.Dao.Pager.PagerDataReaderFactoryRowNumberWrapper" >
  <arg>
    <component class="Seasar.Extension.ADO.Impl.BasicDataReaderFactory" />
  </arg>
  <arg>commandFactory</arg>
</component>

TOPを使用する方法(SQL Server 2000、SQL Server 2005の場合)

SQL Server 2000およびSQL Server 2005のTOP関数を使用する方法です。

この設定を有効にするには、Ado.diconを次の設定に変更してください。

(変更前)
<component name="commandFactory"
           class="Seasar.Extension.ADO.Impl.BasicCommandFactory" />
<component name="dataReaderFactory"
           class="Seasar.Extension.ADO.Impl.BasicDataReaderFactory" />
(変更後)
<component name="commandFactory"
           class="Seasar.Extension.ADO.Impl.BasicCommandFactory" />
<component name="dataReaderFactory"
           class="Seasar.Dao.Pager.PagerDataReaderFactoryTopWrapper" >
  <arg>
    <component class="Seasar.Extension.ADO.Impl.BasicDataReaderFactory" />
  </arg>
  <arg>commandFactory</arg>
</component>

ROWNUMを使用する方法(Oracleの場合)

ORACLEのROWNUMを使用する方法です。

この設定を有効にするには、Ado.diconを次の設定に変更してください。

(変更前)
<component name="commandFactory"
           class="Seasar.Extension.ADO.Impl.BasicCommandFactory" />
<component name="dataReaderFactory"
           class="Seasar.Extension.ADO.Impl.BasicDataReaderFactory" />
(変更後)
<component name="commandFactory"
           class="Seasar.Extension.ADO.Impl.BasicCommandFactory" />
<component name="dataReaderFactory"
           class="Seasar.Dao.Pager.OraclePagerDataReaderFactoryRowNumberWrapper" >
  <arg>
    <component class="Seasar.Extension.ADO.Impl.BasicDataReaderFactory" />
  </arg>
  <arg>commandFactory</arg>
</component>

Limit/Offset句を使用する方法(MySQL、PostgresSQLの場合)

MySQLおよびPostgresSQLなどでサポートしているLimit/Offset句を使用する方法です。

この設定を有効にするには、Ado.diconを次の設定に変更してください。

(変更前)
<component name="commandFactory"
           class="Seasar.Extension.ADO.Impl.BasicCommandFactory" />
<component name="dataReaderFactory"
           class="Seasar.Extension.ADO.Impl.BasicDataReaderFactory" />
(変更後)
<component name="commandFactory"
           class="Seasar.Extension.ADO.Impl.BasicCommandFactory" />
<component name="dataReaderFactory"
           class="Seasar.Dao.Pager.PagerDataReaderFactoryLimitOffsetWrapper" >
  <arg>
    <component class="Seasar.Extension.ADO.Impl.BasicDataReaderFactory" />
  </arg>
  <arg>commandFactory</arg>
</component>

空読み機能を使用する方法(すべてのDBMSで利用可)

System.Data.IDataReaderクラスを空読みすることでページングを実現する方法です。

この設定を有効にするには、Ado.diconを次の設定に変更してください。

(変更前)
<component name="commandFactory"
           class="Seasar.Extension.ADO.Impl.BasicCommandFactory" />
<component name="dataReaderFactory"
           class="Seasar.Extension.ADO.Impl.BasicDataReaderFactory" />
(変更後)
<component name="commandFactory"
           class="Seasar.Extension.ADO.Impl.BasicCommandFactory" />
<component name="dataReaderFactory"
           class="Seasar.Dao.Pager.PagerDataReaderWrapper" >
  <arg>
    <component class="Seasar.Extension.ADO.Impl.BasicDataReaderFactory" />
  </arg>
  <arg>commandFactory</arg>
</component>