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

相关文章
相关标签/搜索