一、问题背景:
今天用jdbcTemplate写SQL,想试下能不能使用具名参数(即:冒号加参数名),结果报错:Invalid argument value: java.lang.ArrayIndexOutOfBoundsException。
二、原因分析:
jdbcTemplate没有对具名参数的处理,是无法使用具名参数的。
三、解决办法:
①使用NamedParameterJdbcTemplate:NamedParameterJdbcTemplate是对jdbcTemplate的再封装,可以使用具名参数。
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
更换为:
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dataSource"/>
</bean>
②自己创建工具方法解析替换具名参数:
/**
* 解析替换具名参数
* @param sql 要执行的SQL
* @param map 参数map
* @return 替换后的SQL
* @author nview
* @date 2021-08-19
*/
public String getSql(String sql, Map<String, String> map) {
while (sql.indexOf(":") >= 0) {
int x = sql.indexOf(":");
int y = sql.substring(x).indexOf(" ");
int end = sql.length();
if (y >= 0) {
end = x + y;
}
String key = sql.substring(x + 1, end);
String value = map.get(key);
if (null != value && !"null".equals(value)) {
value = "'" + value + "'";
}
sql = sql.substring(0, x) + value + sql.substring(end);
}
System.out.println(sql);
return sql;
}