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

http://blog.csdn.net/ppby2002/article/details/34433521


今天做项目,遇到的问题就是需求修改数据表的记录,而且字段名都不是固定的,也就是说是需要通过参数传入的,

本来这也不是什么难题,按照平常的JDBC,或者hibernate里也都好实现,可问题是现在项目用的mybatis这个持久层框架,按照我的刚开始的想法初使sql是这样的,

当我满心欢喜的运行才发现不行,遂百度之,办法种用尽,还是不行,有人给我说需要把字段那一项换成${field},这种办法来取,试之,无果,于是我种蛋疼。
           网上查找半天发现,提出的方法大都不能用,也都差不多,我放弃了。翻了一下电脑里的mybatis文档,在一个不起眼的地方发现update标签有一个属性statementType,一看我就觉得这个属性不简单,资料解释如下:



 看到这,相信会点java的人都知道什么意思了吧
这个statement,preparedstatement,到底什么意思,我这不多做解释,实在不懂请参阅:
http://wenku.baidu.com/view/ccb9da020740be1e650e9abc.html
简单说就是一个是预编译的,一个是非预编译的。
如果你要动态传入字段名,表名之类的如果你的sql执行是预编译的,这显然 
是不行的,所以你必须改成非预编译的,也就是这样:
Xml代码  
收藏代码
  1. <update id="editIssuedData" parameterType="map" statementType="STATEMENT">  
同时sql里的属有变量取值最好都改成${xxxx},而不是#{xxx}
当我改好之后,这是我的完整xml:


 你妹,还是不行,数据库报错说,

这注明一下:三班是我传给sql里变量val的值,仔细一看报的错,是不是感觉有点不一样,对了,就是不一样,是不是感觉三班这个东西少了个引号,其实就是这样的,所以最后一步,需要在java代码里做,如下:
Java代码  
收藏代码
  1. Map<String, Object> map = new HashMap<String, Object>();  
  2.         map.put("field", Constant.ISSUED_PLAN_COLUMN_NAME.get(field));  
  3.         map.put("val""'"+value+"'");  
  4.         map.put("id", id);  
 在往map里put参数时,对应的val我在put时在参数前后加了个单引号,这样就可以了,本人已测试成功!
如果要动态传入表名,与传入字段名相同的。
我发现也有不少人遇到这个问题,这里权当参考,希望可以帮到你!

代码片
XML
<update id="deleteByFieldName" parameterType="java.util.Map" statementType="STATEMENT">
UPDATE ${tableName}
SET ${columnName} = ''
WHERE del_flag = ${DEL_FLAG_NORMAL} AND industry_id = ${industryId}
<if test="worksheetTypeId != null and worksheetTypeId != ''">
AND worksheet_type_id = ${worksheetTypeId}
</if>
</update>
Java
HashMap<String, String> map = new HashMap<String, String>();
for(WorksheetTypeColumn wstc : wstcs2){
map.put("tableName", "crm_def_customer");
map.put("columnName", wstc.getFieldName());
map.put("industryId", "'" + wstc.getIndustryId() + "'");
map.put("DEL_FLAG_NORMAL", "'" + wstc.getDelFlag() + "'");
map.put("worksheetTypeId", "'242f09d121344610a0ab63f823836fff'");
//map.put("worksheetTypeId", null);
defCustomerService.deleteByFieldName(map);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值