纪念一次犯蠢事件
启动webapp项目时,碰到了如下报错(错误信息提示主要是前面几行,后面的没加进来):
BaseController - org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for elecsteal_data.selectAll
### Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for elecsteal_data.selectAll
org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:75)
org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:371)
com.sun.proxy.$Proxy13.selectList(Unknown Source)
org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:198)
com.ctbr.baseFrame.dao.BaseDao.selectList(BaseDao.java:37)
com.ctbr.baseFrame.dao.PageServiceDao.queryPageResult(PageServiceDao.java:30)
com.ctbr.elecsteal.service.impl.DataServiceImpl.queryPageForMap(DataServiceImpl.java:68)
com.ctbr.elecsteal.service.impl.DataServiceImpl$$FastClassBySpringCGLIB$$15ac65ba.invoke(<generated>)
这个报错网上一搜其实有不少文章,基本有四种原因:
1. sql的 id 值不匹配
2.namespace 没有引用正确
3.mapper.xml中的方法和接口mapper的方法不对应
4.没有加入到mybatis-config.xml中(即总的配置文件)
但是我出现了第五种,就是文件目录结构错了,在模仿原来项目创建文件夹的时候,我创建的文件夹在电脑中显示是这样的:
这样子在idea中呈现的效果和二级目录的一样(真的一模一样,导致我一点没怀疑是这里的问题,直到我今天用svn需要复制自己写的代码,才发现目录结构的问题),idea效果如下(蓝色框是二级目录呈现的,红色框是我犯的错):
解决方案就是把目录结构都统一成这样:
改成这样的目录结构也是因为在我的applicationContext.xml文件中有定义mapper.xml文件的路径:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath*:com/ctbr/**/mapper/*.xml" />
</bean>
所以如果跟我一样是在已有项目基础上续写的朋友们,写的时候一定观察好原项目的各个组成结构