DBからデータを取得するには?(SimpleJdbcTemplate のサンプル) | Java Springの逆引きメモ

Java Springの逆引きメモ

JavaのSpring frameworkのメモを書いていきます!
初心者の勉強ノートなので間違いがあるかもしれませんが、何かヒントになることがあれば幸いです。

'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&amp;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


のような場合、マッピングクラスをわざわざ用意するのは大変です。

こんなときに使用します。


他にも便利なメソッドがあるので使っていきましょう!



参考:

・トップ

DIの設定ファイルを書くには?

SpringJDBCの機能について

・SpringJDBCで作成したDaoとビジネスロジックを連携するには?

・DBからデータを取得するには?(SimpleJdbcTemplate のサンプル)

・DBからデータを取得するには?(NamedParameterJdbcTemplateのサンプル)

・NamedParameterJdbcTemplateをうまく使うには? (HashMap版)

・結果をMapの配列で受け取るには?

・DBにデータを登録するには?

・DBへのデータ登録を簡単にするには?

・実行したSQL文のログを出力するには?