简述: 在项目中mapper.xml
和java文件没有放在一起报错了,特来记录一下。
本文初发于 “曾晨de小站” zengchen233.cn,同步转载于此。
UserMapper.java
public interface UserMapper {
List<User> getUserList(String name);
}
UserMapper.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="cn.zengchen233.dao.UserMapper">
<!--模糊查询-->
<select id="getUserList" parameterType="string" resultType="user">
select * from user where name like "%"#{name}"%"
</select>
</mapper>
mybatis-config.xml
---
<!--将包内的映射器接口实现全部注册为映射器-->
<mappers>
<package name="cn.zengchen233.dao"/>
</mappers>
---
test.java
public class test {
@Test
public void test1() {
SqlSession session = MybatisUtils.getSqlSession();
UserMapper mapper = session.getMapper(UserMapper.class);
List<User> userList = mapper.getUserList("wm");
for (User user : userList) {
System.out.println(user);
}
session.close();
}
}
项目结构图:
mapper.xml
和java
文件并没有放在一起,因为不想在java文件夹下面还有配置文件的存在。
于是乎错误就来了:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.zengchen233.dao.UserMapper.getUserList
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:227)
at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:49)
at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:65)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:58)
at com.sun.proxy.$Proxy7.getUserList(Unknown Source)
at test.test1(test.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
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.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
大致意思就是无效的绑定,我就上官网到处寻找答案,最终找到了:
Mybatis注册映射文件有三种(resource
、class
、package
)
resource
是最推荐使用的:适用于类路径下,直接加载mybatis对应的映射文件,用/
进行分割,对于文件名称和文件位置没有强制限制条件,比较灵活,不容易出错。package
是class
加载方式的简写,一般都会使用package
,适用于类路径下,接口文件与映射文件在同一路径下
,且接口名与映射文件名相同
,并且映射文件命名为接口全类名的情况,即简化了class
于是我就将package
改成了resource
:
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
然后就成功运行!