S2Daoを使ったプログラミングの核となる、Entity(JavaではBeanと表現する。データを入れる「箱」)とDao(Data Access Object。データベース等へのアクセスを透過する)を作っていきませう。
とりあえず、不本意ながらどこにでもあるような 社員と部署 のサンプル を考えてみます。データは以下の通り
EMPLOYEE テーブル
| ID | NAME | DEPT |
| 1 | 山田 太郎 | 1 |
| 2 | 田中 一郎 | 2 |
| 3 | 鈴木 源太郎 | 1 |
DEPT テーブル
| ID | NAME |
| 1 | 開発 |
| 2 | 営業 |
using System;
using Seasar.Dao.Attr;
namespace S2DaoTest {
class Employee {
private int id;
private string name;
private int deptid;
[ID("identity")]
public int Id {
set { id = value; }
get { return id; }
}
public string Name {
set { name = value; }
get { return name; }
}
[Column("DEPT")]
public int DeptId {
set { deptid = value; }
get { return deptid; }
}
}
[Table("DEPT")]
class Department {
private int id;
private string name;
[ID("identity")]
public int Id {
set { id = value; }
get { return id; }
}
public string Name {
set { name = value; }
get { return name; }
}
}
}
とても直感的ですね :)
classにTable属性、プロパティにColumn属性を付けることで、それぞれクラス名とDBテーブル名、プロパティ名とDB列名を関連付けることができます。指定しない場合はクラス名=テーブル名、プロパティ名=DB列名として扱われます。
上の例のIdプロパティに付いているID属性は、INSERT時にDB側で自動付番される値を使うという指示です。(SQLite であれば INTEGER PRIMARY KEY AUTOINCREMENT で作成した列に対して使う)
続いてDaoインタフェースの定義
using System;
using System.Collections.Generic;
using Seasar.Dao.Attr;
namespace S2DaoTest {
[Bean(typeof(Employee))]
interface IEmployeeDao
{
void Insert(Employee e);
void Update(Employee e);
void Delete(Employee e);
Employee Select(int id);
IList<Employee> GetAllList();
}
[Bean(typeof(Department))]
interface IDepartmentDao
{
void Insert(Department d);
void Update(Department d);
void Delete(Department d);
Department Select(int id);
IList<Department> GetAllList();
[Sql("SELECT COUNT(*) FROM EMPLOYEE WHERE DEPT=/*id*/1")]
int GetNumberOf(int id);
}
}
もう見たまんまですよね :D
Bean属性で各Daoが扱うEntityのクラスを指定してあげます。
最後のGetNumberOfは、Sql属性を使って使用すべきSQLをそのまま指定しています。(このクラスに定義すべきかどうかってのはまぁ置いておいて..)
というわけで、次はS2Dao/S2Containerの設定ファイルを書いてあげて、動かしてみます。





コメントする