ここでは、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