mybatis:Parameter 'list' not found. Available parameters are [templateId, param1, param2, valueList]

本文记录了在开发一个普通查询接口时遇到的小坑,特别是在使用MyBatis动态SQL时,对于参数传递和语法理解的误区。通过一个具体案例,详细解析了如何正确使用foreach标签来处理集合参数,避免SQL注入风险。

 

今天开发一个普通的查询接口,看网上的教程被小坑了一把,特此留意

SELECT channelId, name
      FROM channel
      WHERE userId = #{userId,jdbcType=VARCHAR} AND status='Y' AND channelId in  
	    <foreach item="channelIds" index="index" collection="channelIds" open="(" separator="," close=")">
	     #{channelIds}
	    </foreach>

 

 

 

 

 

 

转至:https://www.cnblogs.com/baby-lijun/p/5908088.html

上述的优化方案看起来可行,但是还存在欠缺,因为代码的不全面,下面我进行补充public static String parseToSQLCondition(String matchMethod) { // 去除字符串两端的空格 matchMethod = matchMethod.trim(); // 根据字符串中是否包含 "or" 来决定使用 "or" 还是 "and" 作为分隔符 String[] conditions = matchMethod.split(matchMethod.indexOf("or") >= 0 ? " or " : " and "); // 用于存储最终的 SQL 条件 StringBuilder sqlCondition = new StringBuilder(); // 遍历每个条件 for (int i = 0; i < conditions.length; i++) { String condition = conditions[i].trim(); // 分割条件,得到字段名、匹配方法和匹配值 String[] parts = condition.split(" "); if (parts.length < 3) { throw new IllegalArgumentException("Invalid condition format: " + condition); } String field = parts[0]; // 字段名 String matchType = parts[1]; // 匹配方法 String values = parts[2]; // 匹配值 // 根据匹配类型生成相应的 SQL 条件 if (ConstantInterface.WARNING_CONDITION_KEYWORD_LIKE.equals(matchType)) { // 如果匹配类型是 "包含",则将匹配值按逗号分割,生成多个 "like" 条件 String[] valueList = values.split(","); sqlCondition.append("( "); // 添加左括号,用于将多个 "like" 条件括起来 for (int j = 0; j < valueList.length; j++) { if (j > 0) { sqlCondition.append(" or "); // 如果不是第一个条件,添加 "or" } sqlCondition.append(field).append(" like '%").append(valueList[j]).append("%'"); // 生成 "like" 条件 } sqlCondition.append(" ) "); // 添加右括号 } else if (ConstantInterface.WARNING_CONDITION_KEYWORD_NOTLIKE.equals(matchType)) { // 如果匹配类型是 "不包含",则生成 "not like" 条件 sqlCondition.append(field).append(" not like '%").append(values).append("%'"); } else { // 如果匹配类型不是 "包含" 或 "不包含",则抛出异常 throw new IllegalArgumentException("Unsupported match type: " + matchType); } // 如果不是最后一个条件,添加 "or" 或 "and" if (i < conditions.length - 1) { sqlCondition.append(matchMethod.indexOf("or") >= 0 ? " or " : " and "); } } // 返回生成的 SQL 条件,添加外层的括号 return sqlCondition.toString(); } private void conditionsMeetsDataForRulesToCCMNuwa(LocalDateTime statrtDate, LocalDateTime endDate, Integer csdcConditionSize, GeWarningRulesListEntity rules) { /** 调用 抽取方法 获取数据返回 若是无数据 默认 null*/ List<ConditionsMeetsEntity> conditionsMeetsEntities = getConditionsMeetsList(statrtDate, endDate, csdcConditionSize, rules); if (CollectionUtils.isEmpty(conditionsMeetsEntities)) { return; } System.out.println(">>>>>>>>>>>>>>>>>Into ge_rules_meets_data statrtDate:" + statrtDate); System.out.println(">>>>>>>>>>>>>>>>>Into ge_rules_meets_data endDate:" + endDate); System.out.println(">>>>>>>>>>>>>>>>>Into ge_rules_meets_data csdcConditionSize:" + csdcConditionSize); System.out.println(">>>>>>>>>>>>>>>>>Into ge_rules_meets_data rulesID:" + rules.getId()); System.out.println(">>>>>>>>>>>>>>>>>Into ge_rules_meets_data:" + JSON.toJSONString(conditionsMeetsEntities)); /** 遍历全部systemid */ for (ConditionsMeetsEntity conditionsMeetsEntity : conditionsMeetsEntities) { /** 提权 systemid 和时间戳 当做条件查询符合的数据*/ List<CCMDataEntity> ccmDataEntities = ccmDataEntityMapper.selectCCMDataEntityList( CCMDataEntity.builder().systemId(conditionsMeetsEntity.getSystemId()).timestamp(conditionsMeetsEntity.getMatchTime()).build()); if (CollectionUtils.isEmpty(ccmDataEntities)) { break; } /** 当出现通一时间节点存在多条数据的时候 默认获取第一条 */ CCMDataEntity ccmDataEntity = ccmDataEntities.get(0); CsdcRulesMeetsDataEntity rulesMeetsData = new CsdcRulesMeetsDataEntity(); /*** SystemId*/ rulesMeetsData.setSystemId(ccmDataEntity.getSystemId()); /*** 通道名称*/ rulesMeetsData.setChannelName(ccmDataEntity.getChannelName()); /*** Modality*/ rulesMeetsData.setModality(ccmDataEntity.getModality()); /*** 产品*/ rulesMeetsData.setProduct(ccmDataEntity.getProduct()); /*** 医院名称*/ rulesMeetsData.setHospitalName(ccmDataEntity.getHospitalName()); /** * 区域:原zone */ rulesMeetsData.setRegion(ccmDataEntity.getZone()); /** * 告警类型 */ rulesMeetsData.setWarningType(ccmDataEntity.getChannelName()); /** * 告警时间 */ rulesMeetsData.setWarningTime(ccmDataEntity.getTimestamp()); /** * 实际值 */ rulesMeetsData.setNowValue(ccmDataEntity.getValue()); /** * 根据warning_time开始算起的持续时间 */ // rulesMeetsData.setContinuedWarningTime(ccmDataEntity.getValue()); /** * 数据来源:告警信息详情 */ // rulesMeetsData.setAlertDetails(ccmDataEntity.getValue()); /** * 间隔时间 */ // rulesMeetsData.setWarningFrequnce(rules.get); /** * 数据来源 CCM or EE or APM */ rulesMeetsData.setDataSourceName(ccmDataEntity.getDataSource()); /** * 这个字段应该是APM单独有的字段,原:channelNo */ // rulesMeetsData.setEventId(ccmDataEntity.getDataSource()); /** * 规则名称 */ rulesMeetsData.setRulesName(rules.getName()); /** * 规则id */ rulesMeetsData.setRulesId(rules.getId()); /** * 推送类型:里面包含1-短信,2-邮件,3-工单,4-APM */ rulesMeetsData.setPushType(rules.getNotificationMethod()); /** * 推送状态:0:未推送,1:已推送 */ // rulesMeetsData.setPushStatus(ccmDataEntity.getDataSource()); /** * 消息内容 */ // rulesMeetsData.setActualValue(ccmDataEntity.getDataSource()); /** * 推送时间 */ // rulesMeetsData.setPushTime(ccmDataEntity.getDataSource()); /** * 第一条持续数据的id */ // rulesMeetsData.setFirstContinueDataId(ccmDataEntity.getDataSource()); /** * 数据状态,条件更新时禁用对应规则的推送数据,0-禁用,其他可用 */ rulesMeetsData.setDataStatus("1"); /** 当规则符合时 添加数据到新表中 */ System.out.println(">>>>>>>>>>>>>>>>>Into ge_rules_meets_data DataDataData:" + JSON.toJSONString(rulesMeetsData)); csdcRulesMeetsDataEntityMapper.insertCsdcRulesMeetsDataEntity(rulesMeetsData); /** 创建 修改条件 */ ConditionsMeetsEntity conditionsMeets = ConditionsMeetsEntity.builder().ruleId(rules.getId()) .systemId(ccmDataEntity.getSystemId()).isConsumed(1).build(); /** 修改满足规则数据 记录数据为已消耗数据*/ conditionsMeetsEntityMapper.updateConditionsMeetsConsumed(conditionsMeets); } }
最新发布
12-04
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值