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

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

前言


项目中使用到了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 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性. 具名参数由框架类在运行时用占位符取代


解决办法

获得NamedParameterJdbcTemplate实例,在NamedParameterJdbcTemplate 构造器中直接传入JdbcTemplate的实例即可,如下:

NamedParameterJdbcTemplate nameJdbc = new NamedParameterJdbcTemplate(jdbcTemplate);

使用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) {
    return null;
  }
  }


总结


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


相关文章
|
5月前
|
设计模式 监控 Java
深入浅出 Spring:核心概念和基本用法详解
深入浅出 Spring:核心概念和基本用法详解
100 0
|
5月前
|
druid Java 数据库连接
SpringBoot原理分析 | Spring Data整合:JDBC、Druid、Mybatis
SpringBoot原理分析 | Spring Data整合:JDBC、Druid、Mybatis
112 0
|
4月前
|
JSON Java 数据格式
Spring Boot 中的 @DateTimeFormat 和 @JsonFormat 的用法及作用
【6月更文挑战第11天】在开发 Spring Boot 应用时,处理日期和时间数据是一个常见的需求。Spring Boot 提供了两个注解 @DateTimeFormat 和 @JsonFormat 来帮助我们处理这些问题。
347 4
|
4月前
|
前端开发 Java 开发者
深入理解 Spring Boot 注解:核心功能与高级用法详解
深入理解 Spring Boot 注解:核心功能与高级用法详解
192 1
|
4月前
|
Java 数据库连接 Spring
JDBC配置文件抽取-spring11
JDBC配置文件抽取-spring11
|
5月前
|
设计模式 Java 数据库连接
【Spring源码】JDBC数据源访问实现
我们再来看看阅读线索三,这方面我们从设计模式进行入手。阅读线索三:从这个模块可以学到什么我们看下以下代码,PreparedStatement实例的是由PreparedStatementCreator实现的。再来看看PreparedStatementCreator接口,一共有三个子类实现。也就是说PreparedStatement的三种不同实现被封装到三个子类中,而具体需要哪种实现,只需要传入不同。
【Spring源码】JDBC数据源访问实现
|
5月前
|
设计模式 监控 Java
深入浅出 Spring:核心概念和基本用法详解
深入浅出 Spring:核心概念和基本用法详解
38 1
|
5月前
|
SQL Java 数据库连接
Springboot框架整合Spring JDBC操作数据
JDBC是Java数据库连接API,用于执行SQL并访问多种关系数据库。它包括一系列Java类和接口,用于建立数据库连接、创建数据库操作对象、定义SQL语句、执行操作并处理结果集。直接使用JDBC涉及七个步骤,包括加载驱动、建立连接、创建对象、定义SQL、执行操作、处理结果和关闭资源。Spring Boot的`spring-boot-starter-jdbc`简化了这些步骤,提供了一个在Spring生态中更便捷使用JDBC的封装。集成Spring JDBC需要添加相关依赖,配置数据库连接信息,并通过JdbcTemplate进行数据库操作,如插入、更新、删除和查询。
55 0
|
5月前
|
前端开发 Java Maven
spring boot3参数校验基本用法
spring boot3参数校验基本用法
181 2
|
5月前
|
存储 负载均衡 Java
【Spring底层原理高级进阶】微服务 Spring Cloud 的注册发现机制:Eureka 的架构设计、服务注册与发现的实现原理,深入掌握 Ribbon 和 Feign 的用法 ️
【Spring底层原理高级进阶】微服务 Spring Cloud 的注册发现机制:Eureka 的架构设计、服务注册与发现的实现原理,深入掌握 Ribbon 和 Feign 的用法 ️
下一篇
无影云桌面