mybatis动态表名,列名

@Override
	public Integer handleAlarmBatchRecovery(Map<String, Object> paramMap) {
		String idString = (String)paramMap.get("auuid");//旧告警id,sac告警id,新告警auuid
		String[] idList = idString.split(",");
		List<String> list = Arrays.asList(idList);
		Integer alarmType = (int) paramMap.get("alarmType");
		Integer code = 0;
		Map<String,Object> alarm = new HashMap<>();
		String tableName = null;
		String colName = "status";
		Integer colValue = 0;
		String id = "id";
		alarm.put("list", list);
		try {
			if(alarmType==1){//旧告警类型
				tableName = "t_door_lock_alarm_info";
//				alarmDetailsInfoMapper.handleOldAlarmRecovery(list);
			}else if(alarmType==2){//sac告警类型
				tableName = "t_sac_alarm";
//				alarmDetailsInfoMapper.handleSacAlarmRecovery(list);
			}else if(alarmType==3){//统一告警类型
				tableName = "t_common_alarm";
				colName = "astatus";
				id = "auuid";
				colValue = 3;
//				alarmDetailsInfoMapper.handleEsdAlarmRecovery(list);
			}
			alarm.put("tableName", tableName);
			alarm.put("colName", colName);
			alarm.put("colValue", colValue);
			alarm.put("id", id);
			alarmDetailsInfoMapper.handleUnifiedRecovery(alarm);
		} catch (Exception e) {
			code = 1;
			e.printStackTrace();
		}
		return code;
	}

 

要实现动态调用表名和字段名,就不能使用预编译了,需添加statementType="STATEMENT"" 。

statementType:STATEMENT(非预编译),PREPARED(预编译)或CALLABLE中的任意一个。
这就告诉 MyBatis 分别使用Statement,PreparedStatement或者CallableStatement。
默认:PREPARED。这里显然不能使用预编译,要改成非预编译。
<update id="handleUnifiedRecovery" parameterType="java.util.Map" statementType="STATEMENT">
        UPDATE ${tableName}
        set 
        ${colName} = ${colValue}
        where ${id} in
        <foreach collection="list" item="item" index="index" separator="," open="(" close=")">
            ${item}
        </foreach>
    </update>

注意点: 

1、sql里的变量取值是${xxx},不是#{xxx}。

2、如果${xxx}传入的参数为字符串数据,需在参数传入前加上引号,exam:

String name = "sprite";
name = "'" + name + "'";

或者在xml这样写:

因为我们传的参数值(除去表名、表字段)的引号也被去掉了,我们需要在给参数加上引号,此时我们可以使用转义符:&apos; 是单引号,

<update id="obsoleteWeigh" statementType="STATEMENT">
    update ${tableName} set iobsolete = 1,update_date = &apos;${date}&apos; where reg_id in
    <foreach item="id" collection="ids" separator="," open="(" close=")" index="">
        &apos;${id}&apos;
    </foreach>
</update>

(1)转义序列字符之间不能有空格; 
(2) 转义序列必须以”;”结束; 
(3) 单独出现的”&”不会被认为是转义的开始; 
(4) 区分大小写。

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值