美文网首页分布式服务网站博客 一只阿木木
Mybatis绑定多个mapper,@ResultMap 报错

Mybatis绑定多个mapper,@ResultMap 报错

作者: 一只阿木木 | 来源:发表于2018-04-27 19:23 被阅读8次

    mybatis绑定多个mapper,@ResultMap 报错: Mapped Statements collection already contains value for .......

    一般有三个原因:

      1. parameterMap改成parameterType...
      1. id 重复
      1. parameterType参数有问题

    检查了 id,没有重复的,检查了parameterMap等常规错误,没发现问题。

    事件还原:

    大概是这样的,项目中用了 mybatis的自动生成代码插件,
    于是生成了类似 Activity.java、ActivityMapper.java、ActivityMapper.xml 的这三种文件。

    为了方便替换生成的文件,自动生成的ActivityMapper.xml就尽量不改动,我们自己写的sql就放在命名为 ActivityExtMapper.xml中, 当然xml里面的namespace要和ActivitiMapper.xml保持一致。

    于是,一个ActivityMapper.java就对应了两个 xml文件。xxx.xml.auto.generate 目录放的自动生成的xml, xxx.xml就是自己写的xml,如图:

    image

    于是,在配置文件中,扫描xml的路径为:

    image

    突然,问题出现了!
    因为项目是多人写的,所以我们的sql有用注解的,有用xml的。比如,其中有个sql就用的注解,如图:

    image

    我觉得这个问题奇葩的地方是,这个sql最近没改过,而且之前一直运行好好的,突然昨天在我的电脑和另外个同事的电脑上运行的时候,就会报错:Mapped Statements collection already contains value for xxx.getProductInvestOrders; 但是在其他同事的电脑中运行又没问题!

    后来才发现,是因为有多个mapper.xml, 执行sql时是随机找了一个xml来绑定ResultMap,可能会绑定到自动生成的xxMapper.xml中的BaseResultMap。

    而这个sql的ResultMap的ID是自己写的定义在 xxxExtMapper.xml中的,所以执行sql的时候,就会报错,意思是已经为这个sql绑定了一个ResultMap了,不要重复绑定。
    问题找到了,就是要指定加载xml的顺序。如图:


    image

    总结下来,还是对mybatis的掌握不够深入。注解用得也比较少。

    转自 blueriver 博客
    原文链接

    相关文章

      网友评论

      本文标题:Mybatis绑定多个mapper,@ResultMap 报错

      本文链接:https://www.haomeiwen.com/subject/pbuilftx.html