Java, 原创MyBatis, MySql
调用MyBatis Mapper报BindingException Invalid bound statement 问题排查
- by chenxue4076
- 3 years ago
这个问题搜索到的很多,但是都不解决不了我的问题,首先整理下网上的解决方案。
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
1. 首先验证 target 目录下是否有对应 Mapper.xml, 如果没有可以参考下面3部。
target/classes/mybatis 目录检查 xxxMapper.xml
1-1. 本地环境问题
## 如果你的项目使用的是mybatis-plus 请检查下面的配置
mybatis-plus:
mapper-locations: classpath:mapper/*Mapper.xml
## 如果你的项目使用的是mybatis请检查下面的配置
mybatis:
mapper-locations: classpath:mapper/*Mapper.xml
比如我的配置如下,含多个路径,这当然不是我的解决方案。
mybatis:
mapper-locations: classpath:/mybatis/*Mapper.xml, classpath:/mybatis/**/*Mapper.xml
1-2. xxxMapper.xml 与 xxxMapper.java 文件名不同,这也不是我的原因。
1-3. 还有部分是 Mapper.xml 和 Mapper.java 放在了同一目录。
这需要额外配置 pom.xml解决。
</build>
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的.properties,.xml文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
2. target/classess/mybatis 目录下有相关 xxxMapper.xml
先说下我使用的是 tk.mybatis, 继承了 SelectMapper等
@RegisterMapper
public interface BaseQueryMapper<T extends BaseDO> extends SelectMapper<T>, SelectByConditionMapper<T>,
SelectCountByConditionMapper<T> {
List<T> query(@Param("query") T query, @Param("orderField") String orderField, @Param("orderBy") String orderBy);
List<T> page(@Param("query") T query, @Param("offset") Integer offset, @Param("limit") Integer limit,
@Param("orderField") String orderField, @Param("orderBy") String orderBy);
Integer count(@Param("query") T query);
}
问题排查:
通过单元测试 发现
1)能正常调用的
- SelectMapper下的 select(T var1)
- SelectByConditionMapper 下的 List selectByCondition(Object var1)
- SelectCountByConditionMapper下的int selectCountByCondition(Object var1)
2)不能正常调用的,会报 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)的函数。 继承自接口 BaseQueryMapper 下定义的函数,和 BaseQueryMapper 下面的函数。
继续排查注解:
给 query(), page(),count()函数添加注解,发现不在报以上错误(BindingException: Invalid bound statement (not found))。
@RegisterMapper
public interface BaseQueryMapper<T extends BaseDO> extends SelectMapper<T>, SelectByConditionMapper<T>,
SelectCountByConditionMapper<T> {
@Select("SELECT * FROM user")
List<T> query(@Param("query") T query, @Param("orderField") String orderField, @Param("orderBy") String orderBy);
@Select("SELECT * FROM user LIMIT 0, 10")
List<T> page(@Param("query") T query, @Param("offset") Integer offset, @Param("limit") Integer limit,
@Param("orderField") String orderField, @Param("orderBy") String orderBy);
@Select("SELECT COUNT(*) FROM user")
Integer count(@Param("query") T query);
}
经上面分析,我们发现我们定义的 xxxMapper.xml 实际上并没有起到作用,使用注解的会起作用。
那现在的问题就变成了 为什么 xxxMapper.xml 没有起作用的问题。
(450)