Spring JDBC中NamedParameterJdbcTemplate的使用,包括in的用法

前言

項目中使用到了Spring JDBC, 一般jdbcTemplate基本可以滿足我們的需求,我們可以通過?占位符來傳參,方式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;
        }


問題

如果我們在sql中使用了in,那么通過?占位符來傳參是不能解決問題的,直接拼接sql又會有sql注入的風(fēng)險。這種情況下我們可以使用NamedParameterJdbcTemplate 來解決問題。
NamedParameterJdbcTemplate支持具名參數(shù)
PS:具名參數(shù): SQL 按名稱(以冒號開頭)而不是按位置進(jìn)行指定. 具名參數(shù)更易于維護(hù), 也提升了可讀性. 具名參數(shù)由框架類在運行時用占位符取代
解決辦法

    獲得NamedParameterJdbcTemplate實例,在NamedParameterJdbcTemplate 構(gòu)造器中直接傳入JdbcTemplate的實例即可,如下:

NamedParameterJdbcTemplate nameJdbc = new NamedParameterJdbcTemplate(jdbcTemplate);

   
    使用NamedParameterJdbcTemplate實例,我們可以把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)飛哥
微信公眾號:碼農(nóng)飛哥