技術空間

Spring

NamedParameterJdbcTemplateでSQLのプレースホルダに名前を使う


TOP > Spring > NamedParameterJdbcTemplateでSQLのプレースホルダに名前を使う



■SQLのプレースホルダに任意の名前を使う

SQLのプレースホルダに「?」ではなく、任意の名前を使うことができる。

以下の手順で実現可能。(本記事最後に全体のコードを記載)


①NamedParameterJdbcTemplateを使用する。

JdbcTemplateではなく、NamedParameterJdbcTemplateを使用する。使用方法は以下2通りある。

方法1.Spring設定ファイルに記述してインジェクションさせる

Spring設定ファイルにbean定義を記述し、Daoにsetterメソッドを作成する。(この辺の手順はJdbcTemplateと同じ)

Spring設定ファイル
<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;
}
方法2.NamedParameterJdbcDaoSupportを継承する

DaoにNamedParameterJdbcDaoSupportを継承させれば、Spring設定ファイルにbean定義などは不要。

Daoクラス
public class SampleDao extends NamedParameterJdbcDaoSupport {

NamedParameterJdbcDaoSupportを継承している場合、getNamedParameterJdbcTemplate()が使える。

List<String> ret = getNamedParameterJdbcTemplate().queryForList(sql, parameters, String.class);

[参考:JdbcTemplateの場合]

Daoクラス
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インタフェース)を使う。

Mapの場合
// 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;
    }
}
- Springの入門本 -



TOP > Spring > NamedParameterJdbcTemplateでSQLのプレースホルダに名前を使う

Tweet ̃Gg[͂ĂȃubN}[Nɒlj
技術空間