我使用simpleJDBCTemplate将值插入postgre数据库。
String sql "insert into testTable values(:bla, :blah, functionThatTakesAText(':blu'))"
BeanPropertySqlParameterSource namedParameters = new BeanPropertySqlParameterSource(lighting);
simpleJdbcTemplate.update(sql, namedParameters);
现在,blu参数实际上是一个从客户端给出的文件中读取的数字(实际的sql需要2个实数)。
结果,数据库收到如下内容:
insert into testTable values(?, ?, functionThatTakesAText(':blu'))
并且无法按预期更换:blu参数。
我正在使用的当前解决方法是使用正则表达式将blu参数替换为其值,但我不确定它的安全性。
你会如何解决这个问题?
答案 0 :(得分:2)
Spring会跳过SQL中引号内的任何内容(参见skipCommentsAndQuotes()
的{{1}}方法),因为不应该触及引号内的任何内容。
在这种情况下这是有意义的 - 你希望准备好的陈述说出
NamedParameterUtils
而不是
functionThatTakesAText(?)
尝试删除那里的引号,并且应该正确替换占位符。