'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版)