mybatis插入动态表名

项目场景:

项目中需要动态的选择插入的数据表名,但是在实际使用过程中总会遇到部分问题


问题描述:

在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版权协议,转载请附上原文出处链接和本声明。