问题
今天,在测试我自己的项目时,出现了这样的错误:
Cause: java.lang.IllegalArgumentException:
Mapped Statements collection does not contain value for com.zbygroup.booklib.model.entity.delete_db.delete_user at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(
ExceptionFactory.java:23
) at org.apache.ibatis.session.defaults.DefaultSqlSession.update(
DefaultSqlSession.java:147
) at org.apache.ibatis.session.defaults.DefaultSqlSession.delete(
DefaultSqlSession.java:158
) at com.zbygroup.booklib.model.dao.ImpleDao.deleteOne(
ImpleDao.java:66
) at com.zbygroup.booklib.fore_end.model.daoImple.UserDaoImple.deleteUser(
UserDaoImple.java:73
) at com.zbygroup.booklib.fore_end.model.service.UserLogOffService.deleteUserInfo(
UserLogOffService.java:35
) at com.zbygroup.booklib.fore_end.web.controllers.UserLogOffServlet.checkOrderForm(
UserLogOffServlet.java:39
)
... 20 more
它说配置文件中没有数据传入,为什么会报出这个问题呢?
在分析问题之前,我们探讨下java代码如何和mybatis的配置文件
关联起来,以班级为例子,进行探讨。
代码和配置文件
我们现在有个班级(class)表
,需求是根据班级的id获取班级信息,因而,我们写三个文件:
文件名 | 解释 |
---|---|
TbClass.java | 实体代码文件 |
ClassMapper.java | 映射代码文件,即传统的dao文件 |
classMapper.xml | 配置文件 |
TbClass.java
package com.example.demo.entity;
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class TbClass {
private String name;
private String No;
}
ClassMapper.java
package com.example.demo.mapper;
/**
* @author zby
* @datetime 2022/6/21 14:56
* @desc 班级Mapper
*/
@Mapper
public interface ClassMapper {
TbClass getClass(long classId);
}
classMapper.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.demo.mapper.ClassMapper">
<select id="getClass" parameterType="Long" resultType=" com.example.demo.entity.TbClass">
SELECT * FROM `class` WHERE id = #{classId}
</select>
</mapper>
- classMapper.xml使用字段
namespace
与ClassMapper关联起来 - classMapper.xml使用字段
resultType
与TbClass 关联起来
** 这段代码时可以正常运行的,如果我的代码如此配置,应该也可以运行,因而,需要进行如下分析,查看我的代码是不是如此配置。**
分析问题
分析配置文件
我反复检查了配置文件的配置项:
<delete id="delete_user" parameterType="String">
delete from user where u_name=#{uname};
</delete>
这里的参数并没有写错,是不是传参的问题?
分析传参
我传入的参数也是对的,如:
public int deleteUser(String uname){
return this.deleteOne(delete_user, uname);
}
这里也没有问题,在反复检查的过程中,是不是配置文件错了。
分析映射文件
蓦然发现,映射文件写错了:
public static final String
FORE=" com/zbygroup/booklib/model/entity/delete_db/delete_user";
解决问题
因为映射文件这里有个空格,导致映射文件解析时出现了错误。
其他解决问题的方式
如果以上解决方案无法解决你的问题,可以参看如下常见问题:
1 .mybatis的映射文件的命令空间与接口的全限定名不一致;
-
有可能mybatis的映射文件名字与接口的类名字不一致;
-
还有一种情况就是接口声明的方法在映射文件里面没有。