原
Mapped Statements collection does not contain value for解决方案
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
建立简单的mybatis的demo的时候,出现这样的提示:
-
org.apache.ibatis.exceptions.
PersistenceException:
-
###
Error querying database.
Cause: java.lang.
IllegalArgumentException:
Mapped
Statements collection does not contain value
for x.y.z.findUserById
-
###
Cause: java.lang.
IllegalArgumentException:
Mapped
Statements collection does not contain value
for x.y.z.findUserById
-
at org.apache.ibatis.exceptions.
ExceptionFactory.wrapException(
ExceptionFactory.java:
30)
-
at org.apache.ibatis.session.defaults.
DefaultSqlSession.selectList(
DefaultSqlSession.java:
150)
-
at org.apache.ibatis.session.defaults.
DefaultSqlSession.selectList(
DefaultSqlSession.java:
141)
-
at org.apache.ibatis.session.defaults.
DefaultSqlSession.selectOne(
DefaultSqlSession.java:
77)
-
at dao.userDaoImpl.findUserById(userDaoImpl.java:
19)
-
at test.
TestUserClass.testFindUserById(
TestUserClass.java:
11)
-
at sun.
reflect.
NativeMethodAccessorImpl.invoke0(
Native
Method)
-
at sun.
reflect.
NativeMethodAccessorImpl.invoke(
Unknown
Source)
-
at sun.
reflect.
DelegatingMethodAccessorImpl.invoke(
Unknown
Source)
-
at java.lang.
reflect.
Method.invoke(
Unknown
Source)
-
at org.junit.runners.model.
FrameworkMethod$
1.runReflectiveCall(
FrameworkMethod.java:
50)
-
at org.junit.
internal.runners.model.
ReflectiveCallable.run(
ReflectiveCallable.java:
12)
-
at org.junit.runners.model.
FrameworkMethod.invokeExplosively(
FrameworkMethod.java:
47)
-
at org.junit.
internal.runners.statements.
InvokeMethod.evaluate(
InvokeMethod.java:
17)
-
at org.junit.runners.
ParentRunner.runLeaf(
ParentRunner.java:
325)
-
at org.junit.runners.
BlockJUnit4ClassRunner.runChild(
BlockJUnit4ClassRunner.java:
78)
-
at org.junit.runners.
BlockJUnit4ClassRunner.runChild(
BlockJUnit4ClassRunner.java:
57)
-
at org.junit.runners.
ParentRunner$
3.run(
ParentRunner.java:
290)
-
at org.junit.runners.
ParentRunner$
1.schedule(
ParentRunner.java:
71)
-
at org.junit.runners.
ParentRunner.runChildren(
ParentRunner.java:
288)
-
at org.junit.runners.
ParentRunner.access$
000(
ParentRunner.java:
58)
-
at org.junit.runners.
ParentRunner$
2.evaluate(
ParentRunner.java:
268)
-
at org.junit.runners.
ParentRunner.run(
ParentRunner.java:
363)
-
at org.eclipse.jdt.
internal.junit4.runner.
JUnit4TestReference.run(
JUnit4TestReference.java:
86)
-
at org.eclipse.jdt.
internal.junit.runner.
TestExecution.run(
TestExecution.java:
38)
-
at org.eclipse.jdt.
internal.junit.runner.
RemoteTestRunner.runTests(
RemoteTestRunner.java:
459)
-
at org.eclipse.jdt.
internal.junit.runner.
RemoteTestRunner.runTests(
RemoteTestRunner.java:
675)
-
at org.eclipse.jdt.
internal.junit.runner.
RemoteTestRunner.run(
RemoteTestRunner.java:
382)
-
at org.eclipse.jdt.
internal.junit.runner.
RemoteTestRunner.main(
RemoteTestRunner.java:
192)
-
Caused by: java.lang.
IllegalArgumentException:
Mapped
Statements collection does not contain value
for x.y.z.findUserById
-
at org.apache.ibatis.session.
Configuration$
StrictMap.
get(
Configuration.java:
888)
-
at org.apache.ibatis.session.
Configuration.getMappedStatement(
Configuration.java:
721)
-
at org.apache.ibatis.session.
Configuration.getMappedStatement(
Configuration.java:
714)
-
at org.apache.ibatis.session.defaults.
DefaultSqlSession.selectList(
DefaultSqlSession.java:
147)
-
...
27 more
网上的解决方案主要有几种,我仔细发现,自己好像mapper里的xml文件没有写好:
before:
<mapper namespace="x.y.z.">
after:
<mapper namespace="x.y.z">
因为在编译的时候namespace给我们自动添加一个点(.),验证一下:
<mapper namespace="x.y.z.">
user=(User)session.selectOne("x.y.z..findUserById",id);
结果完全正确,此坑验证成功
如果不添加:
user=(User)session.selectOne("x.y.z.findUserById",id);
结果就是显示最开始的错误