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中如果方法签名最好不要混用相同的方法名称。