'2012.03.01 追記:SimpleJdbcTemplate はSpring3.1から廃止(depricated)になったようです。
ですので、JdbcTemplateかNamedParameterJdbcTemplateを使用した方が良いと思います。
ここでは、SpringJDBCを使用して、DBから値を取得するサンプルを記述します。
SimpleJdbcTemplate クラスは、以下のような場合に良く使用します。
・SQL文にプレースするものがない場合
・SQL文にプレースがあるが?を使用したい場合
さて、早速サンプルをみてみましょう。
【DaoインターフェースのJavaコード例】
import java.util.List; import business.domain.Member;
public interface MemberDao { /** * 会員検索をする。 * @return 検索結果 */ List<Member> findMember();
}
【DaoのJavaコード例】
import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import org.apache.commons.validator.GenericValidator; import org.springframework.jdbc.core.simple.ParameterizedRowMapper; import business.domain.Member; public class MemberDaoImpl extends JdbcDaoSupport implements MemberDao { //会員情報マッピング protected class MemberRowMapper implements ParameterizedRowMapper<Member> { public Member mapRow(ResultSet rs, int rowNum) throws SQLException { Member mem = new Member(); mem.setId(rs.getString("id")); mem.setKana(rs.getString("kana")); mem.setKanji(rs.getString("kanji")); return mem; } } //JDBCのテンプレート protected NamedParameterJdbcTemplate namedParameterTemplate; protected SimpleJdbcTemplate simpleTemplate; //初期化処理 protected void initDao() { this.namedParameterTemplate = new NamedParameterJdbcTemplate(getDataSource()); this.simpleTemplate = new SimpleJdbcTemplate(getDataSource()); } // @SuppressWarnings("unchecked") public List<Member> findMember() { // String sql = "select * from t_member "; //会員リスト List<Member> memberList = this.simpleTemplate.query( sql, new MemberRowMapper() ); return memberList; } }
【Springの設定】
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="org.postgresql.Driver"/> <property name="url"> <value>jdbc:postgresql://localhost/test?useUnicode=true&characterEncoding=utf-8</value> </property> <property name="username" value="user" /> <property name="password" value="pass" />
</bean>
<bean id="memberDao" class="dao.MemberDaoImpl"> <property name="dataSource" ref="dataSource" /> </bean>
【説明】
Javaのクラスは、JdbcDaoSupport を継承してメソッドを実装していきます。
まず準備として、MemberRowMapperのようなマッピングクラスを作成します。
これは、ParameterizedRowMapperを継承して作成します。
実装するのはmapRowメソッドだけで、この中でResultSetとオブジェクトのマッピングをします。
次にするのは、実際のSQLの処理です。
といっても、SQL文を作ってsimpleTemplate.query( )を呼ぶだけです。
Springの設定ファイルでは、データソースと先ほど作成したDaoのクラスを設定するだけです。
これでDBから値を取得できます。
【?のプレースを使用する場合の例】
queryのところが以下のようになります。
String sql = "select * from t_member where date < ?";
//会員リスト
List<Member> memberList = this.simpleTemplate.query(
sql, new MemberRowMapper(), new Date()
);
引数の最後にプレースするオブジェクトを指定します。
ここは可変引数になっているので、?の数だけ指定していきます。
【補足】
Springが用意しているSQLの実行をするクラスは以下の2つです。
//JDBCのテンプレート
protected NamedParameterJdbcTemplate namedParameterTemplate;
protected SimpleJdbcTemplate simpleTemplate;
それぞれselectも更新系も実行するメソッドがそれぞれ用意されています。
2つの違いは何でしょうか?
SimpleJdbcTemplate はプレースホルダーに"?"を使用します。
ですので、置き換えするデータを可変引数で指定するか、Object配列で指定します。
NamedParameterJdbcTemplate は、プレースホルダーに":id"のようなパラメタ名を
使用できます。
単純なものは上の方が便利ですし、プレースホルダを使用する場合は下の方が便利です。
うまく使い分けて行ってください。
【その他】
上の2つにはqueryForIntなどの便利なメソッドもあります。
これはマッピングクラスを引数に取る必要がないのです。
select count(*) from member
のような場合、マッピングクラスをわざわざ用意するのは大変です。
こんなときに使用します。
他にも便利なメソッドがあるので使っていきましょう!
参考:
・SpringJDBCで作成したDaoとビジネスロジックを連携するには?
・DBからデータを取得するには?(SimpleJdbcTemplate のサンプル)
・DBからデータを取得するには?(NamedParameterJdbcTemplateのサンプル)
・NamedParameterJdbcTemplateをうまく使うには? (HashMap版)