mybatis插入动态表名

项目场景:

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


问题描述:

在xml中填写sql语句,由于表中含有月份信息,需要动态的选择表名,然而用#{}的方式传参,总是显示语句错误


    
        insert into #{tableName} values
        
            (
            #{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 into ${tableName} values
        
            (
            #{SA.s1T},#{SA.s1A},#{SA.s1B},#{SA.s1C},#{SA.s1D},#{SA.s1E},#{SA.s1F},#{SA.s1G},#{SA.s1H}
            )
        foreach >
    insert >

你可能感兴趣的:(mysql,java,spring,mybatis)