5.3. JdbcTemplate#queryForInt(), queryForLong(), queryForObject()
上述の execute() メソッドでは値を受け取る必要のないステートメントの発行が出来ましたが、データベースを扱うアプリケーションでは単一の値を取得したいことも良くあります。例えば、あるテーブルのレコード数や特定のレコードの特定のカラムの値を取得したいことがあります。JdbcTemplate
にはこのような場合に使えるメソッドとして queryForInt()
, queryForLong()
,
queryForObject()
メソッドが用意されています。以下に queryForInt()
,
queryForLong()
メソッドのシグニチャを示します。
queryForXxx(String sql)
queryForXxx(String sql, Object[] args)
Xxx の部分には Int, Long, が対応し、これらは返り値の型とも対応しています。例えば queryForInt()
は int 型の値を返します。PreparedStatement で使用する "?" で表されるプレースホルダを使用する際は、引数の
args でプレースホルダにセットする値の配列を渡します。
以下は queryForObject()
メソッドのシグニチャです。
Object queryForObject(String sql, Class requiredType)
Object queryForObject(String sql, Object[] args, Class requiredType)
引数の requiredType には期待される返り値の型を指定します。ここで指定した型と実際の返り値の型が一致しないときには InvalidDataAccessApiUsageException がスローされます。
public class PersonDao { private DataSource dataSource = null; public int getCount() { final String sql = "select count(*) from person"; JdbcTemplate jt = new JdbcTemplate(this.dataSource); return jt.queryForInt(sql); } public String getFirstNameById(int id) { final String sql = "select first_name from person where id=?"; JdbcTemplate jt = new JdbcTemplate(this.dataSource); return (String) jt.queryForObject(sql, new Object[]{new Integer(id)}, String.class); } public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } }
getFirstNameById()
メソッドでは引数が 3つの queryForObject()
を使用し、指定した ID の first_name カラムの値を取得しています。2番目の引数でプレースホルダにセットする値を、3番目の引数では返り値の型を指定しています。