mybatis动态接收表名,字段名,字段值

由于没分清mybatis中的$和#的区别,在处理数据上折腾了许久。

案例如下:

我要通过在实体MisWorkflowCommon中取值,在mybatis对应的映射文件的SQL中获取到对应的值,从而进行update处理,修改后的部分mybatis文件如下:

<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中对数据进行拼串处理,部分代码如下:

MisWorkflowCommon model = list.get(0);
model.setStatusVal("‘"+statusVal+"‘");
model.setServiceId(Integer.valueOf(serviceId.substring(3, serviceId.length())));
int updateNum = this.misWorkflowCommonService.updateServiceStatus(model);

此处要注意$和#的区别:

$部分

$直接显示当前值,不会做其他处理,所以在做动态传值的时候要用$,比如我遇见的上述情况,当然,当你要用字段进行排序,也是需要使用$的。

$运行非预编译sql 会导致sql硬解析,如果这个语句执行的比较频繁,会导致数据库性能下降。

$无法防止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

时间: 2024-11-05 13:49:29

mybatis动态接收表名,字段名,字段值的相关文章

[转]MyBatis动态传入表名,字段名参数的解决办法

一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用功能.今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,如某张表的某些字段不让用户查询到.这种情况下,就需要构建sql来动态传入表名.字段名了.现在对解决方法进行下总结,希望对遇到同样问题的伙伴有些帮助. 动态SQL是mybatis的强大特性之一,mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态sql进行处理.下面让我们先

mybatis动态调用表名和字段名

一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用功能.今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,如某张表的某些字段不让用户查询到.这种情况下,就需要构建sql来动态传入表名.字段名了.现在对解决方法进行下总结,希望对遇到同样问题的伙伴有些帮助. 动态SQL是mybatis的强大特性之一,mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态sql进行处理.下面让我们先

mybatis动态传入表名、列名

原文:http://luoyu-ds.iteye.com/blog/1517607 要实现动态传入表名.列名,需要做如下修改 添加属性statementType="STATEMENT" (可省略) 同时sql里的属有变量取值都改成${xxxx},而不是#{xxx} <delete id="deleteTableData" parameterType="java.util.Map" statementType="STATEMENT&

mybatis 动态添加表,查看表,添加数据

1.动态添加表 mapper int dropExistTable(@Param("tableName") String tableName);//自动创建数据表 映射文件 <update id="dropExistTable" parameterType="string" statementType="STATEMENT"> CREATE TABLE ${tableName} ( `id` int(11) NOT

Mybatis动态建表

在网上查了很多,都说Mybatis不支持动态建表,心凉了一节.还好找到这么一篇,找到了希望:http://www.zzzyk.com/show/ec5660d9cf1071b3.htm 经过在mysql环境下验证,确实可用,不知道其他数据库是否支持,如下: Mapper.xml <update id="createNewTable"> create table `${realTableName}`( `id` int(11) NOT NULL AUTO_INCREMENT,

Mybatis动态传表名(同样适用于动态传表字段)

//设置map参数,innerTable,outTable对应的表名 public String sendDetail(){ pager = getStartPager(); if( null !=msg && msg.equals("succ")){ map.put("innerTable","bs_sent_inner" ); map.put("outTable","bs_sent_out&quo

MyBatis动态传入表名,字段名参数的解决办法

<select id="getSearchTableInfo" parameterType="java.util.HashMap"    resultType="TableProfile" statementType="STATEMENT">        select id as unid,name        from ${tb}    </select> AA statementType:STA

Mysql + Mybatis动态建表

service层业务 package com.zx.common.service.impl; import com.zx.common.entity.SysUser; import com.zx.common.mapper.SysUserMapper; import com.zx.common.service.SysUserService; import com.zx.common.util.DateUtil; import org.springframework.beans.factory.a

根据要求完成表单以及使用servlet处理表单 任务要求 掌握Servlet输出表单和接收表单数据(多值组件的读取)。

Servlet代码: package com.test; import java.io.IOException; import java.io.PrintWriter; import java.util.Arrays; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servl