DBにデータを登録するには? | Java Springの逆引きメモ

Java Springの逆引きメモ

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

ここでは、SpringJDBCを使用してDBに値をinsert/updateする例を見てみます。

ケースによっていろいろな方法があるのですが、その一部を記述します。


例によって、Dao部分のみ記述します。



【insert/updateのサンプル (フィールド名とMemberのgetter名が違う場合)】

public class MemberDaoImpl extends WakJdbcDaoSupport implements MemberDao {
  protected NamedParameterJdbcTemplate namedParameterTemplate;
  protected SimpleJdbcTemplate simpleTemplate;
 
  protected void initDao()
  {
    this.namedParameterTemplate = new NamedParameterJdbcTemplate(getDataSource());
    this.simpleTemplate = new SimpleJdbcTemplate(getDataSource());
  }

  //会員更新SQL文 
  final private static String UPDATE_MEMBER_SQL = "update t_member set f_kana=:kana, f_kanji=:kanji "
     + " where f_id=:key_id";
  final private static String INSERT_MEMBER_SQL = "insert into t_member(f_id, f_kana, f_kanji) "
     + " values(:id, :kana, :kanji)";

  //会員更新マッピング
  protected class UpdateMemberParameter extends MapSqlParameterSource 
  {
    public UpdateMemberParameter(Member member) {
      addValue("key_id", member.getId());
      addValue("id", member.getId());
      addValue("kanji", member.getKanji());
      addValue("kana", member.getKana());
    }

  }


 @Override
 /** 会員情報をinsertします。登録数を返します */
 public int insertMember(Member member) {
  //
  SqlParameterSource paramSource = new UpdateMemberParameter(member);
  int num = this.namedParameterTemplate.update(INSERT_MEMBER_SQL, paramSource);
  //
  return num;
 }
 
 
 @Override
 /** 会員情報をupdateします。更新数を返します */
 public int updateMember(Member member) {
  //
  SqlParameterSource paramSource = new UpdateMemberParameter(member);
  int num = this.namedParameterTemplate.update(UPDATE_MEMBER_SQL, paramSource);
  //
  return num;
 }
}





【説明】

実は、DBのテーブルのフィールド名とデータオブジェクトのgetter名が同じ場合はもっと簡単な方法もあります。

同じではないケースの方が多いと思いますので、ここでは、それぞれの名称が違うケースを書きました。


<SQL文の記述>
まず、SQL文を記述していますが、名前つきプレースホルダを使用しています。

そうです!

以前記事にしましたNamedParameterJdbcTemplateを使用するためです。


<マッピング>

では、SQL文に記述したプレースホルダのパラメタ名とデータのマッピングはどこでやっているのでしょう。

UpdateMemberParameter クラスで実装しています。

コンストラクタ内でaddValue()を呼び出していますが、これはMapSqlParameterSource クラスが持っているメソッドで、パラメタ名と値を結びつけるメソッドです。

ちなみに、このクラスは update/insert文の両方で使用できるので、再利用できる利点があります。


addValueで"key_id"というテーブルのフィールド名と関係ない値を設定しています。

これは、updateのwhere句で使用する値とsetで更新する値とを分けるための工夫です。

ここでは意味がありませんが、あるidのレコードを探して、

見つけたレコードのidの値を変更したい場合などに役に立ちます。



<SQLの実行>

SQL文の実行は単純です。

namedParameterTemplateのupdateを呼び出すだけです。

引数は、SQL文とマッピングした値を持ったMapSqlParameterSource です。


割と簡単でしょ?


でも、ひとつひとつのクラスの役割が明確なので、とっても見通しが良いのです!



<補足>

SpringSecurityには、他にも様々な機能があります。

ここでは触れませんが、名前だけ紹介しておきます。


・自動でidを生成してinsertしてくれる機能(executeAndReturnKeyメソッド:生成したidは返却してくれる)

・insert文を書かずにinsertしてくれる機能(SimpleJdbcInsert クラス)

・オブジェクトのgetter名をマップのキーにしてパラメタクラスを作る機能(BeanPropertySqlParameterSourceクラス)

・Listに入ったオブジェクトを一回のメソッドで繰り返しSQL文を実行する機能(batchUpdateメソッド)



また、SimpleJdbcTemplate クラスを使用して"?"のプレースホルダでDBを更新(insert/update)することもできます。

ぜひぜひいろいろ使って安全性と楽を手に入れてくださいニコニコ



参考:

・DBへのデータ登録を簡単にするには?  (SimpleJdbcInsert, BeanPropertySqlParameterSourceのサンプル)

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

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

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

http://static.springframework.org/spring/docs/2.5.x/reference/jdbc.html