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

S2Dao.NET - Daoインターフェース

Dao(Data Access Object)はインターフェースとして作成します。Entityに永続化するデータを格納し、Daoが永続化を行います。 Entityとは1:1の関係にあるので、1つのEntityクラスに対して1つのDaoインターフェースを作成することになります。 Daoのメソッドを呼ぶことによりメソッドに対応したSQLを実行します。SQLは自動生成や部分的に自動生成、 もしくはSQLファイルに記述されているものが実行されます。

Daoインターフェースで使用する属性はSeasar.Dao.Attrs名前空間にあります。 Daoインターフェースには以下の2点が必要になります。

また必要に応じて以下の機能を使用します。

Bean属性

DaoインターフェースがどのEntityクラスに関連付けられているのかをBean属性で指定します。 Entity属性ではなくBean属性である理由はJavaのS2Daoと統一しているためです。

IEmployeeDaoインターフェースがEmployeeエンティティに関連付けられている場合は、次のように定義します。

C#
[Bean(typeof(Employee))]
public interface IEmployeeDao
VB.NET
<Bean(GetType(Employee))> _
Public Interface IEmployeeDao

メソッドを定義する

Daoインターフェースに定義したメソッドを呼ぶことによりメソッドに対応したSQLが実行されますが、 更新処理(INSERT, UPDATE, DELETE)、検索処理毎にメソッドの命名規則があります。 S2Dao.NETではメソッドの命名規則よりSQL文の種類を自動的に判別しています。 また、定義するメソッドのオーバーロードはサポートしていません。

INSERT処理とINSERT文の自動生成

INSERT処理を行うメソッドの名前は、Insert, Add, Createのいずれかから始まる必要があります。 戻り値はvoid(VB.NETではSub)あるいはSystem.Int32(C#はint, VB.NETはInteger)を指定して下さい。 System.Int32の場合、更新した行数が戻り値となります。引数の型はEntityの型と一致させます。

特に属性やSQLファイルを用意していない場合は、自動的にINSERT文が生成され実行されます。

メソッドの定義例は以下のようになります。

C#
void Insert(Employee employee);
int AddEmp(Employee employee);
void CreateEmployee(Employee employee);
VB.NET
Sub Insert(employee As Employee)
Function AddEmp(employee As Employee) As Integer
Sub CreateEmployee(employee As Employee)

UPDATE処理とUPDATE文の自動生成

UPDATE処理を行うメソッドの名前は、Update, Modify, Storeのいずれかから始まる必要があります。 戻り値はvoid(VB.NETではSub)あるいはSystem.Int32(C#はint, VB.NETはInteger)を指定して下さい。 System.Int32の場合、更新した行数が戻り値となります。引数の型はEntityの型と一致させます。

特に属性やSQLファイルを用意していない場合は、自動的にUPDATE文が生成され実行されます。 WHERE句はプライマリキーから作成されます。

メソッドの定義例は以下のようになります。

C#
void Update(Employee employee);
int ModifyEmp(Employee employee);
void StoreEmployee(Employee employee);
VB.NET
Sub Update(employee As Employee)
Function ModifyEmp(employee As Employee) As Integer
Sub StoreEmployee(employee As Employee)

DELETE処理とDELETE文の自動生成

DELETE処理を行うメソッドの名前は、Delete, Removeのいずれかから始まる必要があります。 戻り値はvoid(VB.NETではSub)あるいはSystem.Int32(C#はint, VB.NETはInteger)を指定して下さい。 System.Int32の場合、更新した行数が戻り値となります。引数の型はEntityの型と一致させます。

特に属性やSQLファイルを用意していない場合は、自動的にDELETE文が生成され実行されます。 WHERE句はプライマリキーから作成されます。

メソッドの定義例は以下のようになります。

C#
void Delete(Employee employee);
int RemoveEmp(Employee employee);
VB.NET
Sub Delete(employee As Employee)
Function RemoveEmp(employee As Employee) As Integer

検索(SELECT)処理とSELECT文の自動生成

検索処理を行う場合は、上記のケース以外で戻り値の型を指定します。戻り値の型がSystem.Collections.IListの場合は、 SELECT文でエンティティのリスト(System.Collections.ArrayList)を返します。戻り値がエンティティ型の配列である場合は、 エンティティ配列を返します。戻り値の型がエンティティの型の場合は、エンティティを返します。それ以外の場合は、 SELECT count(*) FROM empのように1行1カラムの値を返すというようにS2Dao.NETは想定します。

特に属性やSQLファイルが用意されていない場合は、全てのカラムを全行取得するSELECT文が自動生成され実行されます。

メソッドのsignature(引数の値や型)からWHERE句を自動生成する

属性やSQLファイルが用意されていなくてもメソッドのsignature(引数の値や型)から、S2Dao.NETにWHERE句を自動生成させることもできます。 引数の型には組み込み型の他にSystem.Data.SqlTypes名前空間のデータ型、もしくは NHibernateのNullables のデータ型を指定することも出来ます。

SELECT * FROM emp
/*BEGIN*/WHERE
  /*IF job != null*/job = /*job*/'CLERK'/*END*/
  /*IF deptno.HasValue == true*/AND deptno = /*deptno*/20/*END*/
/*END*/

上記SQL文に相当するSQL文を自動生成するには以下のようにメソッドを定義します。上記SQLの/**/等の記法については、 SQLコメントのドキュメントを参照して下さい。

C#
IList GetEmployeeByJobDeptno(string job, NullableInt32 deptno);
VB.NET
Function GetEmployeeByJobDeptno(job As String, deptno As NullableInt32) As IList

N:1でマッピングされているカラムを指定する場合には、「カラム名_Relno属性で指定した番号」で指定します。 N:1でマッピングされているEntityは左外部結合を使って1つのSQL文で取得されます。左外部結合をサポートしていないRDBMSはSELECT文自動生成の対象外です。 オラクルのように左外部結合が標準と異なる場合も、S2Dao.NETがRDBMSの種類を自動的に判断して適切なSQL文を組み立てます。

以下作成中・・・