SQLのプレースホルダに「?」ではなく、任意の名前を使うことができる。
以下の手順で実現可能。(本記事最後に全体のコードを記載)
①NamedParameterJdbcTemplateを使用する。
JdbcTemplateではなく、NamedParameterJdbcTemplateを使用する。使用方法は以下2通りある。
Spring設定ファイルにbean定義を記述し、Daoにsetterメソッドを作成する。(この辺の手順はJdbcTemplateと同じ)
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dataSource" />
</bean>
Daoクラス
private NamedParameterJdbcTemplate jdbcTemplate;
@Autowired
public void setJdbcTemplate(NamedParameterJdbcTemplate jdbcTemplate){
this.jdbcTemplate = jdbcTemplate;
}
[参考:JdbcTemplateの場合]
Spring設定ファイル<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg ref="dataSource" />
</bean>
Daoクラス
private JdbcTemplate jdbcTemplate;
@Autowired
public void setJdbcTemplate(JdbcTemplate jdbcTemplate){
this.jdbcTemplate = jdbcTemplate;
}
DaoにNamedParameterJdbcDaoSupportを継承させれば、Spring設定ファイルにbean定義などは不要。
public class SampleDao extends NamedParameterJdbcDaoSupport {
NamedParameterJdbcDaoSupportを継承している場合、getNamedParameterJdbcTemplate()が使える。
List<String> ret = getNamedParameterJdbcTemplate().queryForList(sql, parameters, String.class);
[参考:JdbcTemplateの場合]
public class SampleDao extends JdbcDaoSupport {
List<String> ret = getJdbcTemplate().queryForList(sql, String.class);
②SQLのプレースホルダを「?」ではなく「:XXX」形式にする。
select name from sampletbl where id=:id
[参考:JdbcTemplateの場合]
select name from sampletbl where id=?
③バインドパラメータを設定する。
バインドパラメータを設定するには、MapもしくはMapSqlParameterSource(SqlParameterSourceインタフェース)を使う。
// SQLの定義
String sql = "select name from sampletbl where id=:id";
// Mapにパラメータを設定する
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("id", 1);
// 検索実行
List<String> ret = jdbcTemplate.queryForList(sql, parameters, String.class);
SqlParameterSourceの場合
// SQLの定義
String sql = "select name from sampletbl where id=:id";
// SqlParameterSourceにパラメータを設定する
SqlParameterSource parameters = new MapSqlParameterSource("id", 1);
// 検索実行
List<String> ret = jdbcTemplate.queryForList(sql, parameters, String.class);
SqlParameterSourceでパラメータを複数設定する場合はaddValue()を使う。以下のようにメソッドチェーンを利用すると便利。
SqlParameterSource parameters = new MapSqlParameterSource("id", 1)
.addValue("name", "Bill")
.addValue("gender", "male");
[参考:JdbcTemplateの場合]
引数にそのまま設定する場合// SQLの定義
String sql = "select name from sampletbl where id=?";
// 検索実行
List ret = jdbcTemplate.queryForList(sql, String.class, 1);
Object配列で設定する場合
// SQLの定義
String sql = "select name from sampletbl where id=?";
// 検索実行
List ret = getJdbcTemplate().queryForList(sql, new Object[]{1}, String.class);
最後に全体のDAOのコードをサンプルとして記載。
・NamedParameterJdbcDaoSupportを継承しないパターン(バインドパラメータはSqlParameterSourceを使用)
package test;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.stereotype.Repository;
@Repository
public class SampleDao {
private NamedParameterJdbcTemplate jdbcTemplate;
@Autowired
public void setJdbcTemplate(NamedParameterJdbcTemplate jdbcTemplate){
this.jdbcTemplate = jdbcTemplate;
}
public List<String> select(){
// SQLの定義
String sql = "select name from sampletbl where id=:id";
// SqlParameterSourceにパラメータを設定する
SqlParameterSource parameters = new MapSqlParameterSource("id", 1);
// 検索実行
List<String> ret = jdbcTemplate.queryForList(sql, parameters, String.class);
return ret;
}
}
・NamedParameterJdbcDaoSupportを継承するパターン(バインドパラメータはMapを使用)
package test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
import org.springframework.stereotype.Repository;
@Repository
public class SampleDao extends NamedParameterJdbcDaoSupport {
@Autowired
public void init(DataSource dataSource){
setDataSource(dataSource);
}
public List<String> select(){
// SQLの定義
String sql = "select name from sampletbl where id=:id";
// Mapにパラメータを設定する
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("id", 2);
// 検索実行
List<String> ret = getNamedParameterJdbcTemplate().queryForList(sql, parameters, String.class);
return ret;
}
}