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