Spring JDBC中NamedParameterJdbcTemplate的使用,包括in的用法
前言
項(xiàng)目中使用到了Spring JDBC, 一般jdbcTemplate
基本可以滿足我們的需求,我們可以通過?
占位符來(lái)傳參,方式sql注入。
例如:
@Override
public boolean queryMultBySpuId(String spuId, String companyId) {
String sql = "SELECT goods_commonid FROM zcy_goods_item WHERE goods_commonid=? AND company_id=? ";
try {
List<String> commonidList=jdbcTemplate.queryForList(sql, new String[]{spuId, companyId},String.class);
if (CollectionUtils.isEmpty(commonidList)) {
return false;
} else {
return true;
}
} catch (DataAccessException e) {
return false;
}
問題
如果我們?cè)趕ql中使用了in
,那么通過?
占位符來(lái)傳參是不能解決問題的,直接拼接sql又會(huì)有sql注入的風(fēng)險(xiǎn)。這種情況下我們可以使用NamedParameterJdbcTemplate
來(lái)解決問題。
NamedParameterJdbcTemplate
支持具名參數(shù)
PS:具名參數(shù): SQL 按名稱(以冒號(hào)開頭)而不是按位置進(jìn)行指定. 具名參數(shù)更易于維護(hù), 也提升了可讀性. 具名參數(shù)由框架類在運(yùn)行時(shí)用占位符取代
解決辦法
- 獲得
NamedParameterJdbcTemplate
實(shí)例,在NamedParameterJdbcTemplate
構(gòu)造器中直接傳入JdbcTemplate
的實(shí)例即可,如下:
NamedParameterJdbcTemplate nameJdbc = new NamedParameterJdbcTemplate(jdbcTemplate);
- 使用
NamedParameterJdbcTemplate
實(shí)例,我們可以把in中的參數(shù)放入map中,值為List<String>
paramMap.put("itemIds", Arrays.asList(itemIds.split(",")))
代碼如下:
@Override
public List<Item> selectItemByIds(String itemIds) {
NamedParameterJdbcTemplate nameJdbc = new NamedParameterJdbcTemplate(jdbcTemplate);
Map<String,Object> paramMap = new HashMap<String, Object>();
try {
String sql = "SELECT * FROM zcy_goods_item WHERE id IN(:itemIds) ORDER BY id DESC";
paramMap.put("itemIds", Arrays.asList(itemIds.split(",")));
return nameJdbc.query(sql,paramMap, new BeanPropertyRowMapper<Item>(Item.class));
} catch (DataAccessException e) {
return null;
}
}
總結(jié)
本文主要介紹了NamedParameterJdbcTemplate的使用,通過NamedParameterJdbcTemplate我們可以把in中的參數(shù)放入map中,值為List<String>
完美的解決了in參數(shù)的傳遞問題。
作者:碼農(nóng)飛哥
微信公眾號(hào):碼農(nóng)飛哥