mybatis動態接收表名,字段名,字段值

因爲沒分清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

相關文章
相關標籤/搜索