<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。
statementType的值設為STATEMENT可以滿足我們的需求,把表名的引號去掉,但是同時也去掉了參數的引號,這樣還是有問題。對Statement和PrepareStatement的理解具體可以參閱:http://wenku.baidu.com/view/ccb9da020740be1e650e9abc.html
把statementType的值設為STATEMENT后,我們需要注意sql里的參數如 #{tableName}、#{date} 都需要改為${},不然無法把參數拼接上去。
做完這些工作之后,我們需要注意的是,我們傳的參數值(除去表名、表字段)的引號也被去掉了,我們需要在給參數加上引號,此時我們可以使用轉義符:' 是單引號,
值得注意的是:
(1)轉義序列字符之間不能有空格;
(2) 轉義序列必須以”;”結束;
(3) 單獨出現的”&”不會被認為是轉義的開始;
(4) 區分大小寫。
最終一個正確的表名動態的sql為:
<update id="obsoleteWeigh" statementType="STATEMENT"> update ${tableName} set iobsolete = 1,update_date = '${date}' where reg_id in <foreach item="id" collection="ids" separator="," open="(" close=")" index=""> '${id}' </foreach> </update>