简述: 在项目中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();
    }
}

项目结构图:

image-20230206095736569

mapper.xmljava文件并没有放在一起,因为不想在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注册映射文件有三种(resourceclasspackage

  1. resource是最推荐使用的:适用于类路径下,直接加载mybatis对应的映射文件,用/进行分割,对于文件名称和文件位置没有强制限制条件,比较灵活,不容易出错。
  2. packageclass加载方式的简写,一般都会使用package,适用于类路径下,接口文件与映射文件在同一路径下,且接口名与映射文件名相同,并且映射文件命名为接口全类名的情况,即简化了class

于是我就将package改成了resource

<mappers>
    <mapper resource="mapper/UserMapper.xml"/>
</mappers>

然后就成功运行!