mybatis动态表名,列名

@Override
	public Integer handleAlarmBatchRecovery(Map paramMap) {
		String idString = (String)paramMap.get("auuid");//旧告警id,sac告警id,新告警auuid
		String[] idList = idString.split(",");
		List list = Arrays.asList(idList);
		Integer alarmType = (int) paramMap.get("alarmType");
		Integer code = 0;
		Map 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 ${tableName}
        set 
        ${colName} = ${colValue}
        where ${id} in
        
            ${item}
        
    

注意点: 

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

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

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

或者在xml这样写:

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


    update ${tableName} set iobsolete = 1,update_date = '${date}' where reg_id in
    
        '${id}'
    

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

你可能感兴趣的:(java,java)