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的单引号,顺利实现删除数据,
<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的单引号,顺利实现删除数据,
相关文章推荐
- ssm项目使用Mybatis动态拼接sql语句,生成的sql中文全部显示为???的问题(配置文件sql语句中文解析问题)
- mybatis 在select语句中使用foreach语句报错
- mybatis foreach in查询语句 关于逗号 空值处理问题
- java中在mybatis的配置文件中使用两个foreach问题
- Mybatis使用<foreach collection="***" item="**" open="(" separator="," close=")">问题
- mybatis中使用log4j打印sql语句不起作用问题
- 【Java学习笔记之十】Java中循环语句foreach使用总结及foreach写法失效的问题
- MyBatis使用foreach进行批量插入遇到的问题以及解决方法
- mybatis使用foreach语句实现IN查询
- jboss7.1.1下使用log4j输出mybatis3.2.2的SQL语句问题与解决方法
- mybatis 使用foreach时出现"The expression 'list' evaluated to a null value"问题
- mybatis中使用if语句遇到的问题
- Mybatis 使用动态语句实现批量删除(delete结合foreach)
- Oracle数据库使用mybatis的foreach标签应注意的问题
- java中foreach语句中使用remove时出现的问题
- insert语句 foreach 、虚表的使用 mybatis
- Mybatis中一条SQL使用两个foreach的问题
- PHP的foreach语句使用引用变量的问题
- MyBatis的foreach语句详解,可解决界面传输的数组对象参数问题
- MyBatis的foreach语句详解