JavaのフレームワークSpringには「Spring JDBC」というJDBCに関連する機能を簡単に実装することができる機能があります。
例)データベースアクセス、SQL実行、例外処理
その中でもデータベースアクセスやSQL実行を簡単にする2つのクラスを紹介したいと思います。
JdbcTemplate と NamedParameterJdbcTemplate
2つのクラスを利用することでデータベースへアクセスしSQLを実行することができます。
この2つのクラスの違いは、バインド変数の指定の仕方が違うという点にあります。
バインド変数の指定とはどういうことかを例に書いてみます。
sampleテーブルからidを指定してデータを取得
idは画面から入力された値を設定したいといった場合に「?」で記載している値は固定値ではなく入力された値にしなければなりません。その際に変数を記載することで変数に指定した値をSQLに埋めこむことが可能になります。
SELECT * FROM sample WHERE id = ?;
SELECT分に限らずUPDATEやINSERT文でも同様です。
またバインド変数は複数指定することも可能です
UPDATE sample SET name = ? WHERE id = ?;
では2つのクラスの違いについて書いていきます。
JdbcTemplate
JdbcTemplateの指定方法です。
String sql = "UPDATE sample SET name = ? WHERE id = ?";
//MapのListで取得
List<Map<String, Object>> results = jdbcTemplate.queryForList(sql, "taro", "1");
バインド変数として扱う値は「?」で記載します。
クエリを実行する際に引数に変数で設定したい値を指定します。
この場合だと、以下が設定されます。
name = “taro”
id = “1”
どの変数にバインドするかは引数の順番で決まります。なので以下とした場合には
jdbcTemplate.queryForList(sql, "1", "taro");
name = “1”
id = “taro” となります。
データを取得するメソッドはqueryForList以外にもいくつか存在しています。また、引数のいくつか指定方法があります。詳しくは公式サイトを見てみてください。
※queryForList は複数行レコードを取得する際に使用するメソッド
取得結果が0件でも問題ない
https://spring.pleiades.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/core/JdbcTemplate.html
NamedParameterJdbcTemplate
NamedParameterJdbcTemplateの指定方法です。
String sql = "UPDATE sample SET name = :name WHERE id = :id";
// パラメータ設定用Map
Map<String, String> param = new HashMap<>();
param.put("id", "1");
param.put("name", "taro")
//MapのListで取得
List<Map<String, Object>> resultList = jdbcTemplate.queryForList(sql, param);
JdbcTemplateの時と異なる部分があります。
バインド変数を名前で指定することができます。
「:変数名」で設定し、変数名とMapのキー情報が一致する値をバインドします。
バインド変数を複数指定する場合でも順番は気にしなくて良くなり、可読性の向上が見込めます。