您好,我是码农飞哥,感谢您阅读本文!本文将介绍使用MyBatis时出现的一些常见问题。
问题描述
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语句。可能的原因有如下:
问题排查
1.检查ArmWorksMapper.xml 的SQL文件中是否有selectById方法,如果对应,则进行下一步检查
2.检查ArmWorksMapper.xml 的namespace是否与ArmWorksMapper类对应,如果对应,则进行下一步检查
3.检查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(); }