相关文章推荐
爱跑步的香蕉  ·  使用Java在Maven项目中通过JDBC连 ...·  1 月前    · 
淡定的野马  ·  云计算基础(持续更新)-阿里云开发者社区·  1 年前    · 
另类的开水瓶  ·  几种python存储数据(海量数据)的方式及 ...·  1 年前    · 
要出家的鞭炮  ·  【嵌入式开发】ARM 关闭中断 ( ...·  2 年前    · 
怕老婆的钱包  ·  java ...·  2 年前    · 
坚强的南瓜  ·  解决Android5.0设置button的e ...·  2 年前    · 
Code  ›  Spring JDBC中NamedParameterJdbcTemplate的使用,包括in的用法开发者社区
spring框架 jdbctemplate string jdbc
https://cloud.tencent.com/developer/article/1804009
孤独的领结
2 年前
作者头像
码农飞哥
0 篇文章

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

原创
前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 好好学习 > Spring JDBC中NamedParameterJdbcTemplate的使用,包括in的用法

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

原创
作者头像
码农飞哥
修改 于 2021-03-22 10:18:51
2.2K 0
修改 于 2021-03-22 10:18:51
举报

前言

项目中使用到了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注入的风险。这种情况下我们可以使用 NamedParameterJdbcTemplate 来解决问题。

NamedParameterJdbcTemplate 支持具名参数

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

解决办法

  1. 获得 NamedParameterJdbcTemplate 实例,在 NamedParameterJdbcTemplate 构造器中直接传入 JdbcTemplate 的实例即可,如下:
NamedParameterJdbcTemplate nameJdbc = new NamedParameterJdbcTemplate(jdbcTemplate);
  1. 使用 NamedParameterJdbcTemplate 实例,我们可以把in中的参数放入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) {
 
推荐文章
爱跑步的香蕉  ·  使用Java在Maven项目中通过JDBC连接ClickHouse-云数据库 ClickHouse-阿里云
1 月前
淡定的野马  ·  云计算基础(持续更新)-阿里云开发者社区
1 年前
另类的开水瓶  ·  几种python存储数据(海量数据)的方式及读取时间对比_python一百万数据csv读取需要多久-CSDN博客
1 年前
要出家的鞭炮  ·  【嵌入式开发】ARM 关闭中断 ( CPRS 中断控制位 | 中断使能寄存器 | 中断屏蔽寄存器 | 关闭中断 | 汇编代码编写 )(二)-阿里云开发者社区
2 年前
怕老婆的钱包  ·  java 中对输入输出流类型重复调用,只对最后一次调用进行关闭,之前的调用不关闭,会有什么后果?_百度知道
2 年前
坚强的南瓜  ·  解决Android5.0设置button的enable为false时的效果不明显 - 简书
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号