mybatis的foreach语句使用问题

项目开发过程中,需要对表中多条记录进行删除和更新处理,为此,使用了mybatis中的foreach配置语句,我配置如下:

  <delete id="deleteSelectedAlarmRecords" parameterType="String">
  delete from alarm
  where id in
  <foreach item="item" index="index" collection="array" 
open="(" separator="," close=")">#{item} 
</foreach>
  </delete> 

使用的参数是字符串数组,在界面操作后,mybatis日志打印如下:

2012-09-04 11:07:37 [DEBUG] [com.cstor.network.alarm.serviceImpl.AlarmInfoServiceImpl.deleteSelectedAlarmRecords(AlarmInfoServiceImpl.java:64)] -- {message:enter AlarmInfoAction.deleteSelectedAlarmRecords(String [] alarmRecordsArray)  [alarmRecordsArray.length] = 2 [alarmRecordsArray] = ['42b92ee6-04f5-47d8-b519-8c62465e2503', '03aaf1c2-79a4-4d55-a160-e51527054e88']}
2012-09-04 11:07:37 [DEBUG] [org.apache.ibatis.logging.slf4j.Slf4jImpl.debug(Slf4jImpl.java:47)] -- {message:ooo Using Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@407c9432]}
2012-09-04 11:07:37 [DEBUG] [org.apache.ibatis.logging.slf4j.Slf4jImpl.debug(Slf4jImpl.java:47)] -- {message:==>  Preparing: delete from alarm where id in ( ? , ? )}
2012-09-04 11:07:37 [DEBUG] [org.apache.ibatis.logging.slf4j.Slf4jImpl.debug(Slf4jImpl.java:47)] -- {message:==>Parameters: '42b92ee6-04f5-47d8-b519-8c62465e2503'(String), '03aaf1c2-79a4-4d55-a160-e51527054e88'(String)}
2012-09-04 11:07:37 [DEBUG] [com.cstor.network.alarm.serviceImpl.AlarmInfoServiceImpl.deleteSelectedAlarmRecords(AlarmInfoServiceImpl.java:70)] -- {message:exit AlarmInfoAction.deleteSelectedAlarmRecords(String [] alarmRecordsArray) }

操作顺利执行,没有报任何错误,但是数据库中的数据没有被删除,我将该语句按如下方式直接在mysql中执行,也没有发现任何异常:

delete from alarm where id in ( '42b92ee6-04f5-47d8-b519-8c62465e2503' , '03aaf1c2-79a4-4d55-a160-e51527054e88' );

研究了很久,也没有找到任何原因,最后试着把字符串数组中保存的ID的单引号去掉,发现能正常删除数据,

至此,终于发现原因所在,原来我传入的是字符串形式的ID,每个ID都是用单引号括起来的,ID传入mysql后,mysql又加了一层单引号,导致语法错误,但mybatis却没有报告错误,而是认为当前sql语句的in条件中,数据库中没有一个符合条件,所有没有删除任何数据。根据分析,去掉字符串数组中的ID的单引号,顺利实现删除数据,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值