前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring JDBC中NamedParameterJdbcTemplate的使用,包括in的用法

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

原创
作者头像
码农飞哥
修改2021-03-22 10:18:51
3.6K0
修改2021-03-22 10:18:51
举报
文章被收录于专栏:好好学习

前言

项目中使用到了Spring JDBC, 一般jdbcTemplate基本可以满足我们的需求,我们可以通过?占位符来传参,方式sql注入。

例如:

代码语言:txt
复制
@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注入的风险。这种情况下我们可以使用NamedParameterJdbcTemplate 来解决问题。

NamedParameterJdbcTemplate支持具名参数

PS:具名参数: SQL 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性. 具名参数由框架类在运行时用占位符取代

解决办法

  1. 获得NamedParameterJdbcTemplate实例,在NamedParameterJdbcTemplate 构造器中直接传入JdbcTemplate的实例即可,如下:
代码语言:txt
复制
NamedParameterJdbcTemplate nameJdbc = new NamedParameterJdbcTemplate(jdbcTemplate);
  1. 使用NamedParameterJdbcTemplate实例,我们可以把in中的参数放入map中,值为List<String>
代码语言:txt
复制
paramMap.put("itemIds", Arrays.asList(itemIds.split(",")))

代码如下:

代码语言:txt
复制
    @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;

        }

    }

总结

本文主要介绍了NamedParameterJdbcTemplate的使用,通过NamedParameterJdbcTemplate我们可以把in中的参数放入map中,值为List<String>完美的解决了in参数的传递问题。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 问题
  • 解决办法
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档