Java, 原创,

调用MyBatis Mapper报BindingException Invalid bound statement 问题排查

这个问题搜索到的很多,但是都不解决不了我的问题,首先整理下网上的解决方案。

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)能正常调用的

  1. SelectMapper下的 select(T var1)
  2. SelectByConditionMapper 下的 List selectByCondition(Object var1)
  3. 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 没有起作用的问题。

(396)

Related Post