项目场景:
项目中需要动态的选择插入的数据表名,但是在实际使用过程中总会遇到部分问题
问题描述:
在xml中填写sql语句,由于表中含有月份信息,需要动态的选择表名,然而用#{}的方式传参,总是显示语句错误
<insert id ="insertSA" parameterType="java.util.List" >
insert into #{tableName} values
<foreach collection ="saList" item="SA" index= "index" separator =",">
(
#{SA.s1T},#{SA.s1A},#{SA.s1B},#{SA.s1C},#{SA.s1D},#{SA.s1E},#{SA.s1F},#{SA.s1G},#{SA.s1H}
)
</foreach >
</insert >
org.springframework.jdbc.UncategorizedSQLException:
### Error updating database. Cause: java.sql.SQLException: sql injection violation, syntax error: error pos 13, line 1, column 12, token QUES : insert into ? values
原因分析:
1、#{} :会根据参数的类型进行处理,当传入String类型,则会为参数加上双引号。
2、${} : 将参数取出不做任何处理,直接放入语句中,就是简单的字符串替换。
也就是说当用#{}进行sql语句拼接的时候,会将表名拼接后加上双引号,当然语句会报异常
解决方案:
更改表名部分的#{}为${}这样就可以插入动态的表名了
<insert id ="insertSA" parameterType="java.util.List" >
insert into ${tableName} values
<foreach collection ="saList" item="SA" index= "index" separator =",">
(
#{SA.s1T},#{SA.s1A},#{SA.s1B},#{SA.s1C},#{SA.s1D},#{SA.s1E},#{SA.s1F},#{SA.s1G},#{SA.s1H}
)
</foreach >
</insert >
版权声明:本文为qq_46660780原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。