Spring Framework 5章 JDBC によるデータアクセス
5.4. JdbcTemplate#queryForList()
5.3 で単一の値の取得方法はわかりましたが、データベースを使用するアプリケーションにおいては複数のカラムの値やレコードを取得したいこともよくあります。たとえばあるレコードのデータを取得し
JavaBeans を生成する場合などです。こういった目的には queryForList()
メソッドが適当です。シグニチャを以下に示します。
List queryForList(String sql)
List queryForList(String sql, Object[] args)
queryForList()
メソッドは java.util.List
を返します。この List
はカラム名をキーとし、カラムのデータを値とする java.util.Map
を要素としてもちます。
public class PersonDao { private DataSource dataSource = null; public List findAll() { final String sql = "select id, first_name, family_name from person"; JdbcTemplate jt = new JdbcTemplate(this.dataSource); List list = jt.queryForList(sql); List personList = new ArrayList(); for (Iterator it = list.iterator(); it.hasNext();) { Map map = (Map) it.next(); Person person = createPerson(map); personList.add(person); } return personList; } private Person createPerson(Map map) { Person person = new Person(); person.setId(((Integer) map.get("id")).intValue()); person.setFirstName((String) map.get("first_name")); person.setFamilyName((String) map.get("family_name")); return person; } public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } }
findAll()
メソッドではテーブルからすべてのデータを抽出しレコード数分の Person インスタンスを生成しています。queryForList()
メソッドが返す List から Map を取り出し、取り出した Map からカラム名をキーとして取得した値を Person インスタンスのプロパティにセットしています。Map
のキー値は RDBMS に依ってすべて大文字で格納される場合もあるため注意してください。
実習課題 1
4章の実習課題 3 を改良しなさい。
- JdbcTemplate を使用すること
- テーブルデータ一覧ではなく任意のレコードのデータを表示すること