1、IDEA中创建mapper.xml文件的包名遇到的坑
最近搭建IDEA+SpringBoot+MyBatis+Maven的项目,使用了逆向工程来生成接口和mapper文件。把逆向工程生成的文件拷贝到工程中,项目结构如下:
启动工程,浏览器访问,却报错了:
此时看到后台的控制台也打印了相关的错误:
然后我就百度了一些,大家都有各种各样出现这个问题的情况,主要有:
1、IDEA对xml文件处理的方式不同:mapper.xml文件需要放置在resource这个文件夹下;而eclipse只要mapper接口文件与mapper.xml放置在同一平级目录就行。
2、xml文件的namespace的值和Mapper接口文件的包名不一致。
但是我的问题都不在这里,因为我的xml文件是放到了resources目录下面,并且仔细查看了各个xml文件的namespace都是正确的路径。最终有一个博客提醒了我,原因如下:
在src目录下面,我们如果建包的时候,一般都可以创建多层包,比如:com.zdw.nettychat,这个是没问题的。但是在resources目录下面创建目录时,如果也是一次性创建多级包,那么此时的包名就是com.zdw.nettychat.mapper,这一长串都是包名,这跟我们的application.properties中配置的:
mybatis.mapper-locations=classpath:com/zdw/nettychat/mapper/*.xml
是对不上的,我们是想着找多级包的,这种情况创建的包,不会分级,效果就跟上面截图的一样,是在同一级的。
解决办法:我们每次只创建一级包名,比如要创建com/zdw/nettychat/mapper的目录,那么就应该先创建com(Directory)目录,然后在com下面创建zdw,再在zdw下面创建nettychat,最后在nettychat下面创建mapper,最终创建的包结构是这样的:
参考:https://blog.csdn.net/benben513624/article/details/81076182
2、使用逆向工程生成接口和xml文件的坑
上面报的异常解决了之后,我启动项目就报错了,这次报的错是不一样的,大概就是:
Caused by: java.lang.RuntimeException: Error parsing Mapper XML.
Cause: java.lang.IllegalArgumentException:
Result Maps collection already contains value for
com.zdw.nettychat.mapper.TbChatRecordMapper.BaseResultMap
这个错误我刚开始都没太注意,一直以为就是之前的mapper.xml文件的原因引起的另一个错误,于是又陷入了上面的死循环中,后来还是百度了一下,找到了答案:
原因是在使用 mybatis 逆向工程生成代码的时候多次重复生成,导致配置配件多次重复积累,解决办法是把逆向工程里面的代码删除掉,然后再点击运行一次,刷新看到代码即可,然后再拷到新工程里面,这样在运行 web 项目就 ok 了
因为我之前由于报错,所以确实重复执行了多次逆向工程,后来我就删除了逆向工程中已经生成的代码,重新执行,然后拷贝到项目中,启动项目,访问:http://localhost:9000/user/selectAll,就能查询到数据了。
参考博客:https://www.2cto.com/kf/201712/706099.html
这两个错误都是比较坑的地方,有可能别人不出错,而我就正好碰上了。因此记录下,希望下次遇到的时候能快速反应,也希望其他人看到了这个博客,能帮助你少走一些弯路。