複数レコードを返す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なのだ。ステキすぎる!