Mybatis动态sql的动态表名问题

Mybatis动态sql的动态表名问题
强烈推介IDEA2021.1.3破解激活,IntelliJ IDEA 注册码,2021.1.3IDEA 激活码  

大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说Mybatis动态sql的动态表名问题,希望能够帮助大家进步!!!

    

<update id="obsoleteWeigh">
    update #{tableName} set iobsolete = 1,update_date = #{date} where reg_id in
    <foreach item="id" collection="ids" separator="," open="(" close=")" index="">
        #{id}
    </foreach>
</update>

 

  一开始这样写的sql,sql语句的表名会有引号,导致sql报错,需要想办法去掉#{tableName}的引号。查了半天发现mybatis的update标签有个属性:statementType。

  Mybatis动态sql的动态表名问题

 

   statementType的值设为STATEMENT可以满足我们的需求,把表名的引号去掉,但是同时也去掉了参数的引号,这样还是有问题。对Statement和PrepareStatement的理解具体可以参阅:http://wenku.baidu.com/view/ccb9da020740be1e650e9abc.html

  把statementType的值设为STATEMENT后,我们需要注意sql里的参数如 #{tableName}、#{date} 都需要改为${},不然无法把参数拼接上去。

  做完这些工作之后,我们需要注意的是,我们传的参数值(除去表名、表字段)的引号也被去掉了,我们需要在给参数加上引号,此时我们可以使用转义符:&apos; 是单引号,

值得注意的是: 
  (1)转义序列字符之间不能有空格; 
  (2) 转义序列必须以”;”结束; 
  (3) 单独出现的”&”不会被认为是转义的开始; 
  (4) 区分大小写。 

  最终一个正确的表名动态的sql为:

<update id="obsoleteWeigh" statementType="STATEMENT">
    update ${tableName} set iobsolete = 1,update_date = &apos;${date}&apos; where reg_id in
    <foreach item="id" collection="ids" separator="," open="(" close=")" index="">
        &apos;${id}&apos;
    </foreach>
</update>
本文来源huayang183,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/18292

发表评论