Invalid bound statement (not found) 問題處理

問題描述

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.modules.dao.rest.ArmWorksMapper.selectById
    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.$Proxy154.selectById(Unknown Source)

問題分析

從問題的描述,可以看出就是ArmWorksMapper類的selectById 方法找不到對應的SQL語句。可能的原因有如下:
問題排查

    檢查ArmWorksMapper.xml 的SQL文件中是否有selectById方法,如果對應,則進行下一步檢查
    檢查ArmWorksMapper.xml 的namespace是否與ArmWorksMapper類對應,如果對應,則進行下一步檢查
    檢查mapper.xml文件是否被掃描到,就是檢查SqlSessionFactoryBean的配置。

   @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean.getObject();
    }

這是我配置的SqlSessionFactoryBean類,在會話工廠中沒有設置mapperLocations,所以MyBatis找不到所有的Mapper.xml文件。修改的方法也很簡單。就是設置mapperLocations屬性。

  @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*mapper.xml"));
        return sqlSessionFactoryBean.getObject();
    }


作者:碼農(nóng)飛哥
微信公眾號:碼農(nóng)飛哥