Invalid bound statement——无效绑定,应该是mybatis最常见的一个异常了,这个异常不管具体什么原因导致,归根结底,就是mapper接口和xml没有绑定成功。这里先简单回顾一下接口与xml的绑定原理。
首先,mapper接口并没有实现类,所以框架会通过JDK动态代理代理模式获取接口的代理实现类,进而根据接口全限定类名+id去一一绑定xml中的sql。
用debug断点我们看到MappedStatement这个对象为空,而通过源码跟踪,这个对象包含了开发人员编写的SQL语句、参数结构、返回值结构、Mybatis对它的处理方式的配置等细节要素,是对一个SQL命令是什么、执行方式的完整定义。
MappedStatement保存在Configuration#mappedStatements这个Map类型的对象中,其存储的key为MappedStatement#id,所以MappedStatement的id是不能重复的,这个id是由Mapper接口的完全限定名和方法名称拼接而成,这就导致了我们在同一个Mapper中不能出现重载的接口方法。
也就是说,在绑定过程中,mapper加载成功了,xml加载失败了,所以将问题定位在xml的身上,通过查看target目录发现,mapper接口的层级目录如下:
而xml编译后的目录如下:
可以发现,xml并没有像接口那样按照文件层级编译,而是被当做了一个文件夹名为mapper.news的文件夹处理,问题就出在这里。原来是自己建立文件夹的时候没有分两步建立,而是偷懒直接建了一个mapper.news的文件夹。真是大坑啊,于是删除重新创建,install,启动,搞定。。。