您的位置:首页 > 其它

mybatis的foreach语句使用问题

2012-09-04 19:31 351 查看
项目开发过程中,需要对表中多条记录进行删除和更新处理,为此,使用了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的单引号,顺利实现删除数据,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: