因为没分清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