seasar2のお勉強6(S2Daoを使ってみる）

S2jdbcの前身？っぽいS2Daoも使ってみました。
S2jdbcでいいじゃないかって思うんですが、次の配属先でS2Dao使っているらしいので・・・。

アクセスするテーブルは[前回の記事](https://qiita.com/komikcomik/items/c26f10837f07c7fae063)と同じですのでそちらを参照。
まずエンティティは以下の通り。
s2jdbcの時は@EntityをつければOKだったけど、S2Daoの場合は下記のように定数定義するか、
@Bean(table="テーブル名")といったアノテーションをクラスにつけるかのどちらかにする必要があるみたいです。

```
package org.seaser2.s2dao.sample.entity;
import java.io.Serializable;

public class Person implements Serializable{

	public static final String TABLE = "Person";

	/** デフォルトシリアルID */
	private static final long serialVersionUID = 1L;

	/** 名前 */
	public String name;

	/** 所属*/
	public String belonging;

	/** 特徴*/
	public String feature;


	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getBelonging() {
		return belonging;
	}

	public void setBelonging(String belonging) {
		this.belonging = belonging;
	}

	public String getFeature() {
		return feature;
	}

	public void setFeature(String feature) {
		this.feature = feature;
	}
}
```

次DAO。1エンティティにつき１DAOのインタフェース作らないとダメみたい。S2jdbcやった後だとIF作ることすら面倒ですね。
どのエンティティとマッピングされたDAOかは下記のように定数宣言するか
@S2Dao(bean = エンティティ名.class)といったアノテーションをクラスにつけるかのどちらかにする必要があるみたいです。

```
package org.seaser2.s2dao.sample.dao;

import java.util.List;

import org.seaser2.s2dao.sample.entity.Person;

public interface PersonDao {

    public static final Class BEAN = Person.class;

    public String selectPerson_ARGS = "feature";

    // 全件検索用メソッド
    public List<Person> selectPerson(String feature);

}
```

あと、selectPersonメソッドで実行されるSQLがこれだとなんだかわからないはずなので
resourcesの下にルートパッケージ名/daoフォルダに下にDAO名_メソッド名_DBMSごとのサフィックス名.sqlという名前のSQLファイルを用意する必要があるみたいです。
DBMSごとのサフィックス名は[公式](http://s2dao.seasar.org/ja/s2dao.html#SQLfile)に書いてます。

なのでresources/org/seaser2/s2dao/sample/dao/PersonDao_selectPerson_postgre.sqlというファイルに

```
SELECT name, belonging, feature FROM person WHERE feature = /*feature*/
```

というSQLを記載しました。
なおファイル名がHoge_sselectPerson_postgre.sqlとかいうふざけたファイル名でも動いてしまったのでメソッドが１つしかなかった場合はファイル名はチェックされていないかもしれないです。
Hoge_sselectPerson_postgre.sqlというファイルと同時にPersonDao_selectPerson_postgre.sqlというファイルも置いて、SQLの内容を変えてみたらPersonDao_selectPerson_postgre.sqlの方を見に行ったのでそんな感じなんじゃないかと。

あと設定ファイル系は
jdbc.diconを前回同様使用するDBに合わせて切り替えするくらいで動きます。

で、最後にDAO呼ぶ人はこんな感じで動きます。

```
package org.seaser2.s2dao.sample.dxo;

import java.util.Iterator;
import java.util.List;

import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
import org.seaser2.s2dao.sample.dao.PersonDao;
import org.seaser2.s2dao.sample.entity.Person;

public class PersonDaoCaller {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SingletonS2ContainerFactory.init();

        S2Container container = SingletonS2ContainerFactory.getContainer();

        PersonDao pjDao = (PersonDao) container.getComponent(PersonDao.class);
        List<Person> results = pjDao.selectPerson("長身");
		for (Iterator<Person> iterator = results.iterator(); iterator.hasNext();) {
			Person person = (Person) iterator.next();
			System.out.print(person.getName());
			System.out.print(person.getBelonging());
			System.out.println(person.getFeature());
		}

		SingletonS2ContainerFactory.destroy();
	}

}
```

今回は本がなかったので公式サイトと[こちらのサイト](http://snowhiro.web.fc2.com/seasar2/Seasar2_04_S2Dao_03.html)を参考にさせてもらいました。感謝。