前回は、テーブルのフィールド名とオブジェクトのgetter名が違う場合のサンプルを見ました。
ここでは、フィールド名とgetter名が同じ場合で、簡単にできる例を見てみましょう。
【サンプル】
private SimpleJdbcInsert insertMember; final private static String UPDATE_MEMBER_SQL = "update t_member set kana=:kana, kanji=:kanji where id=:id"; @Override protected void initDao() { // this.insertMember = new SimpleJdbcInsert(getDataSource()) .withTableName("t_member"); //.usingGeneratedKeyColumns("id"); this.namedParameterTemplate = new NamedParameterJdbcTemplate(getDataSource()); this.simpleTemplate = new SimpleJdbcTemplate(getDataSource()); } @Override public int insertMember(Member member) { // SqlParameterSource paramSource = new BeanPropertySqlParameterSource(member); int num = this.insertMember.execute(paramSource); // return num; } @Override public int updateMember(Member member) { // SqlParameterSource paramSource = new BeanPropertySqlParameterSource(member); int num = this.namedParameterTemplate.update(UPDATE_MEMBER_SQL, paramSource); // return num; }
【説明】
<BeanPropertySqlParameterSource>
前回のサンプルと違って、マッピング用のクラス(UpdateMemberParameter )がなくなっているのが分かるでしょうか?
そうです。実装の必要がなくなるんです。
変わりに、BeanPropertySqlParameterSourceを使用します。
このクラスは、コンストラクタで指定されたオブジェクトのgetter名をキーにしたパラメタクラスを作成します。
やることは、これだけです!
<SimpleJdbcInsert >
さらにinsertの場合だけは自動でSQL文まで記述してくれます。
それを行っているのがSimpleJdbcInsert クラスです。
このクラスは、initDao()内でnewして、初期化をします。
(SpringのHPのサンプルでは、setDataSource()内で初期化をしていましたが)
このとき、withTableNameでテーブル名を指定します。
さらに他の設定があれば、以下のように連続で指定できます。
withTableName().usingGeneratedKeyColumns("id");
あとは、実際に実行するときにexucuteメソッドを呼び出すだけです!
<その他のSimpleJdbcInsert のメソッド>
さらにここでは使用していませんが、executeAndReturnKeyというメソッドも存在します。
これを使うとprimaryキーの値を自動で生成した上に、生成した値を返してくれます。
(準備として、SimpleJdbcInsertのusingGeneratedKeyColumnsを呼び出す必要があります)
かなり簡単になりますよね。
【デメリット】
ここで言うとMemberクラスのsetter/getterの名称をリファクタリングするとなると
Daoの記述をすべて直すか、テーブルのフィールド名をすべて変更しないといけません。
また、逆のパターンでテーブルのフィールド名を変更する場合、SQL文だけでなく、Memberクラスのgetter/setterの名称を変更する必要があります。
ですので、将来変更する可能性がある箇所にはこの方法は使用しないほうが良いでしょう。
前回のやり方の方が変更点が少なくてよいかと思います。
うまく使えばかなり楽になると思うので、うまく使っていきましょう
参考:
・DBからデータを取得するには?(SimpleJdbcTemplate のサンプル)
・DBからデータを取得するには?(NamedParameterJdbcTemplateのサンプル)