问题
在一个项目中,Spring Boot整合mybatis,使用xml文件对接口进行映射。出现异常
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxx.dao.RoleDao.listRole
MyBatis
Spring Boot常见的mybatis xml写法
- 直接在接口的目录下写与接口名相同的
xml
文件(注意检查是否生成xml
文件)。 - 在resource目录下,创建相同的接口包名,在写接口名相同的
xml
文件 - 在resource目录下,任意创建目录,使用
mybatis.mapper-locations
来指定目录文件。
基本方法
1、检查IDEA下是否生成了相应的xml文件,展开target目录
如果没有生成对应的xml文件,那看看为啥没有生成了哦,若是在java目录下写的xml文件,IDEA编译后会把resource下的文件放到target
的classpath
下,src下的Java文件编译生成.class
文件放入classpath
下,其他文件会忽略的。
所以在pom.xml
添加下面代码,让IDEA不要忽略xml文件就可以了哦,刷新一下pom,重新编译下,如还是没有,那就别这样写了,使用第二种方式。
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
2、检查对应的xml
的namespace
与接口名是否对应,IDEA可以直接跳转,看看跳转是否正确,id
与方法名是否对应,可以直接复制,检查一下返回类型是否对应。
3、确保xml文件没有问题后,检查一下mybatis.mapper-locations指定的位置。
有点博客说,将classpath
修改为classpath*
,改一下呗,试一试。(注意:yml
文件中注意空格问题,mybatis顶格)
mybatis:
mapper-locations: classpath*:mapper/*.xml
4、可以在接口方法名上直接使用注解方式,测试是否可以使用。
@Select("select * from role")
List<Role> listRole();
如果不可以,需要先检查注解方式为啥不可以了哦。
5、在resource目录下,将 xml 文件的路径与 dao 层接口保持一致。 application.yml
中的mybatis.mapper-locations
可以不用配置。
注意:IDEA中在resource下创建多层时,仔细检查创建的是不是多层路径。
下面创建方式,Windows识别为包含·
的一层目录
下面创建方式,Windows识别为多层目录,还可以单层目录一层一层的创建。
在IDEA中显示都是一样的
若还是不可以,项目刚新建的话,那就先把这个删掉,重新创建一个。