queryForMap(query,id)について疑問がある

検索したいレコードのidさえわかればデータベースから検索できるのになぜqueryという引数が必要なのでしょうか?

あらゆるデータベースに「id」という名前で主キーが存在するわけではないからです。
そのコードサンプルの前提としているサンプルデータベースの抽出条件とするカラムがたまたま「id」という名前だから「id」という名前でコード上、アクセスしているだけで、データベースによっては別名の場合もあるでしょう。
また抽出したいレコードについて、すべてのカラムではなく必要なカラムだけ限定して抽出したい場合もあるでしょう。

だからこそ、query と言う引数で、対象となるデータベース及び目的とするデータに応じた SQL 文を指定できるようにしているわけです。

queryが分かればidの引数など不要に思います。

これについて「id引数は不要だ。id を変数化して使用したいなら query として直接組み立てる下記のようなコードでいいじゃないか?」と考えていらっしゃるのかもしれません。

String query="select" +"from employee" +"where id=" +id; Map<String, Object> employee=jdcbTemplate.queryForMap(query);

でもこれは、SQLインジェクションを引き起こすおそれのある典型的なダメコードです。

このようなことをさせないために、queryForMap(String sql, @Nullable Object... args)メソッドは、バインド変数を使えるようにしてるんです。(参考:データベースのバインド変数のメリットを語る(②メリット:SQLインジェクションの防止))

コメントを投稿

0 コメント