mybatis方法重载问题


mybatis方法重载问题

在mapper接口中不能重载方法,网上解释大部分的原因是因为mybatis使用package+Mapper+method全限名作为key,在xml中去寻找唯一的sql来执行时候会发生冲突。
以上这样原因的解释是正确的,但是现在网上对这个结果的描述是在启动时会抛出异常,在mybatis-spring-boot-starter.2.1.0的版本中并未发现异常,查看源代码发现在解析xml时候逻辑修改成为,根据key解析出第一个sql语句并执行

  • XPathParser
public List<XNode> evalNodes(Object root, String expression) {
  List<XNode> xnodes = new ArrayList<>();
  NodeList nodes = (NodeList) evaluate(expression, root, XPathConstants.NODESET);
  for (int i = 0; i < nodes.getLength(); i++) {
    xnodes.add(new XNode(this, nodes.item(i), variables));
  }
  return xnodes;
}

深入分析原因是由于mybatis-boot在启动的时候初始化SqlSessionFactory的方式为

public SqlSessionFactory build(Configuration config) {
  return new DefaultSqlSessionFactory(config);
}

解析好配置后进行初始化,并不是mybatis来进行配置文件的解析的,如果是mybatis进行配置文件的解析会在初始化的过程中抛出异常。

深入分析其实在mybatis中不应该定义方法的重载,重载的本质是方法签名不同从而产生不同的结果,但是在ORM中如果方法签名最好不要混用相同的方法名称。


  TOC