异常描述:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):com.sf.dao.UserMapper.selectByPrimaryKey
起初怀疑是在整合mybatis时的配置有错误,反复修改和测试发现配置都没问题。最后检查mapper.xml文件才发现namespace的定义路径名字与mapper接口的路径与名字不一致。
本人是通过
Mybatis Generator自动生成的代码文件。通过这个异常才发现里边这个坑,mapper的xml文件和接口文件如果你想放在同一个包下边,那么使用
Mybatis Generator自动生成的代码文件是完全没问题的,但是如果你想把mapper接口和xml文件分开放置,就需要注意生成后的mapper namespace路径会是你配置的sqlMapGenerator
targetPackage="mybatis.mapper"的路径,然后上边的异常就在你使用mapper接口时出现了。
解决办法就是将生成后的mapper.xml文件中的namespace与你的mapper接口路径比对一下,不同就改为mapper接口的路径。
原理:在mybatis中,映射文件中的namespace是用于绑定mapper接口的,即面向接口编程。 当你的namespace绑定接口后,你可以不用写接口实现类,mybatis会通过该绑定自动帮你找到对应需要执行的SQL语句。Spring在动态代理时,就是需要一个mapper接口的一个实现类,所以当你的mapper.xml与mapper接口类未关联到一块的时候,就会出现上述异常。
总结:
出现上边的类似异常,首先确定配置的资源路径(mapper接口扫描路径,mapper.xml资源路径)是否正确,然后就是排查mapper.xml文件中是否有错误。