在用Mybatis时遇到了一个让我折腾了一晚上的问题(好歹接触Mybatis半年多了,自我感觉不应该存在什么致命盲区了),谁知道这个问题直接把人给干傻了。
先描述问题情况:当时正在写一个接收json数组(用户的ID),来批量删除用户的代码。我将数据封装到了int数组中(因为只是一个很简单的内部管理系统,就直接用整型做的ID)。mapper内容如下:
<!--逻辑删除用户-->
<update id="deleteByIds">
update staff set deleted = 1
where id in
<foreach collection="array" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</update>
写完以后自然要测试,一测试就报了下面的异常:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error updating database. Cause: java.lang.ClassCastException: class [I cannot be cast to class [Ljava.lang.Object; ([I and [Ljava.lang.Object; are in module java.base of loader 'bootstrap')
### The error may exist in file [F:geek-and-hard-workingbee-member-management argetclassesmappersStaffMapper.xml]
### The error may involve com.geekbee.membermanagement.mapper.StaffMapper.deleteByIds
### The error occurred while executing an update
### Cause: java.lang.ClassCastException: class [I cannot be cast to class [Ljava.lang.Object; ([I and [Ljava.lang.Object; are in module java.base of loader 'bootstrap')
从报错上看,说是I(如果了解过Java虚拟机应该知道在虚拟机内部是用I来表示int的)不能转化为Object(前面的L表示这是引用类型),其实这个报错是很明确的,但我不信邪啊。开了Debug,打算看看为会这样(为什么Mybatis可以接受int做参数,却不能接收int数组)。
结果Debug显示数组内容是正常的,但是Mybatis的方法内部调用压根没法看,反复试了几次,受不了了,就把int数组改成了String数组,一测试,OK了。
直接说结论,Mybatis似乎是不能接受基本数据类型数组的,保险起见可以直接用String数组,当然也可以用包装类数组试试。