因爲沒分清mybatis中的$和#的區別,在處理數據上折騰了許久。html
案例以下:java
我要經過在實體MisWorkflowCommon中取值,在mybatis對應的映射文件的SQL中獲取到對應的值,從而進行update處理,修改後的部分mybatis文件以下:sql
<update id="updateServiceStatus" parameterType="com.jiayou.cps.pojo.workflowCommon.MisWorkflowCommon"> update ${tableName} set ${statusColumn} = ${statusVal} where id = ${serviceId} and del_flag = '0' </update>
上述值若是不用$,而是用#的話,那麼控制檯打印的SQL日誌爲update ? set ? = ? ...的形式,並無讀出對應的數據映射到SQL的字段中。數據庫
有些人會在update標籤中加statementType="STATEMENT"參數,此處是不須要添加的,由於使用$就已是非預編譯的了。安全
statusColumn是字符串類型,在java對應的controller中對數據進行拼串處理,部分代碼以下:mybatis
MisWorkflowCommon model = list.get(0); model.setStatusVal("'"+statusVal+"'"); model.setServiceId(Integer.valueOf(serviceId.substring(3, serviceId.length()))); int updateNum = this.misWorkflowCommonService.updateServiceStatus(model);
此處要注意$和#的區別:ide
$部分性能
$直接顯示當前值,不會作其餘處理,因此在作動態傳值的時候要用$,好比我碰見的上述狀況,固然,當你要用字段進行排序,也是須要使用$的。網站
$運行非預編譯sql 會致使sql硬解析,若是這個語句執行的比較頻繁,會致使數據庫性能降低。this
$沒法防止SQL注入,這種方式相似於用Statement處理SQL。
#部分
#當成字符串處理,在值的兩邊會加上雙引號"'",好比select * from table where name=#{column},那麼最終結果是select * from table where name='test'。
#能在很大程序上防止SQL注入,這種方式相似於用Preparedstatement處理SQL,會產生對應的佔位符,由於sql語句已經預編譯好了,傳入參數的時候,不會從新生產sql語句,安全性高,因此能用#就別用$。
參照網站:
http://www.mybatis.org/mybatis-3/sqlmap-xml.html#String_Substitution
http://www.cnblogs.com/kangyun/p/5881531.html