複数レコードを返すselect

BOOKテーブルにあるすべての書籍を取得したい場合、つまりwhere句なしでselectしたい場合、DAOに定義するメソッドの戻り値の型をListか配列にすれば良いらしい。
すべてのEntity(Bookオブジェクト)をListで取得するgetAllBooksメソッドを追加したBookDaoは次の通り。

package examples.s2dao.book.dao;

import java.util.List;

import examples.s2dao.book.entity.Book;


public interface BookDao {
    // Beanの関連付け
    public static final Class BEAN = Book.class;
    // 書籍取得の検索条件
    public static final String getBook_QUERY = "id = ?";
    
    public Book getBook(int id);
    // すべての書籍を取得する
    public List getAllBooks();
}

そして、BookDaoを呼び出す部分。以前から変わったところは、DAOの呼び出し部分がdao.getBookからdao.getAllBooksになっただけ。

public class BookClient {
    private static final String PATH = "examples/s2dao/book/dao/BookDao.dicon";
    
    public static void main(String[] args) {
        S2Container container = S2ContainerFactory.create(PATH);
        container.init();
        try {
            BookDao dao = (BookDao) container.getComponent(BookDao.class);
            System.out.println(dao.getAllBooks());
        } finally {
            container.destroy();
        }
    }
}

実行するとこんな感じ。データはひとつだと味気ないので、適当に追加しておく。

DEBUG 2005-04-11 21:49:35,084 [main] 物理的なコネクションを取得しました
DEBUG 2005-04-11 21:49:35,084 [main] 論理的なコネクションを取得しました
DEBUG 2005-04-11 21:49:37,157 [main] 論理的なコネクションを閉じました
DEBUG 2005-04-11 21:49:37,958 [main] SELECT Book.name, Book.id FROM Book
DEBUG 2005-04-11 21:49:37,958 [main] 論理的なコネクションを取得しました
DEBUG 2005-04-11 21:49:38,098 [main] 論理的なコネクションを閉じました
[id: 0, name: Seasar2入門(仮), id: 1, name: ほげ本]
DEBUG 2005-04-11 21:49:38,108 [main] 物理的なコネクションを閉じました

全件取得できた。S2Daoが生成したSQL文にもwhere句はついていない。まぁ当然か。
ここで気づくのは、BookDaoにListを返すメソッドを追加しただけという事実。普通なら、ここからさて実装を書くかとなるところだが、S2DaoだとListで返して欲しいなと思ったら、ただその通りのシグニチャを書くだけでOKなのだ。ステキすぎる!