JdbcTemplateでは、SQLパラメータは特殊なプレースホルダ ”
?
“で表され、位置によってバインドされます。問題は、パラメータの順序が変更されたとき、パラメータのバインディングも変更する必要があるときです。エラーが発生しやすく、保守が面倒です。
これを修正するには、 ”
Named Parameter
“を使用することができますが、SQLパラメーターは開始コロンで定義され、その後に位置ではなく名前が続きます。
さらに、指定されたパラメーターは、
SimpleJdbcTemplate
および
NamedParameterJdbcTemplate
でのみサポートされます。
Springで名前付きパラメータを使用するには、次の3つの例を参照してください。
例1
単一のinsert文で名前付きパラメータを使用する方法を示す例。
//insert with named parameter
public void insertNamedParameter(Customer customer){
String sql = "INSERT INTO CUSTOMER " +
"(CUST__ID, NAME, AGE) VALUES (:custId, :name, :age)";
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("custId", customer.getCustId());
parameters.put("name", customer.getName());
parameters.put("age", customer.getAge());
getSimpleJdbcTemplate().update(sql, parameters);
}
例2
バッチ操作ステートメントで名前付きパラメーターを使用する方法を示す例。
public void insertBatchNamedParameter(final List<Customer> customers){
String sql = "INSERT INTO CUSTOMER " +
"(CUST__ID, NAME, AGE) VALUES (:custId, :name, :age)";
List<SqlParameterSource> parameters = new ArrayList<SqlParameterSource>();
for (Customer cust : customers) {
parameters.add(new BeanPropertySqlParameterSource(cust));
}
getSimpleJdbcTemplate().batchUpdate(sql,
parameters.toArray(new SqlParameterSource[0]));
}
例3
バッチ操作ステートメントで名前付きパラメーターを使用するもう1つの例。
public void insertBatchNamedParameter2(final List<Customer> customers){
SqlParameterSource[]params =
SqlParameterSourceUtils.createBatch(customers.toArray());
getSimpleJdbcTemplate().batchUpdate(
"INSERT INTO CUSTOMER (CUST__ID, NAME, AGE) VALUES (:custId, :name, :age)",
params);
}