问题
Mapper内的方法能重载(overLoad)吗?
验证
1. UserMapper 写两个queryUserByCondition方法:
@Mapper
@Repository
public interface UserMapper {
baseuser queryUserByCondition(User user);
baseuser queryUserByCondition(Integer id);
}
2. UserMapper.xml写两个select
<select id="queryUserByCondition" parameterType="com.jarvis.msgserver.dto.User" resultType="com.jarvis.msgserver.pojo.baseuser">
select Id,UserName,RealName,Code,UserPassword,ModifiedOn from baseuser
<where>
<if test="Id!=0">
Id=#{Id}
</if>
<if test="username!=null">
and UserName=#{username}
</if>
<if test="password!=null">
and UserPassword=#{password}
</if>
</where>
</select>
<select id="queryUserByCondition" parameterType="java.lang.Integer" resultType="com.jarvis.msgserver.pojo.baseuser">
select Id,UserName,RealName,Code,UserPassword,ModifiedOn from baseuser where Id=#{id}
</select>
3. 测试:
Caused by: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for com.jarvis.msgserver.dao.UserMapper.queryUserByCondition. please check file [E:\JavaStudyProject\msgserver\target\classes\mybatis\dao\UserMapper.xml] and file [E:\JavaStudyProject\msgserver\target\classes\mybatis\dao\UserMapper.xml]
at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:1014)
at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:970)
at org.apache.ibatis.session.Configuration.addMappedStatement(Configuration.java:768)
at org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(MapperBuilderAssistant.java:297)
at org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode(XMLStatementBuilder.java:113)
at org.apache.ibatis.builder.xml.XMLMapperBuilder.buildStatementFromContext(XMLMapperBuilder.java:138)
at org.apache.ibatis.builder.xml.XMLMapperBuilder.buildStatementFromContext(XMLMapperBuilder.java:131)
at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:121)
... 73 common frames omitted
4. 找源码
参考:https://blog.youkuaiyun.com/unix21/article/details/52239514
结论
mybatis查找mapper内的方法是靠方法名,和参数无关。
所以,对于mapper接口,Mybatis禁止方法重载

本文探讨了在MyBatis中Mapper接口内的方法是否可以重载的问题。通过验证和查看源码,得出结论:MyBatis是通过方法名来查找对应SQL,与参数无关,因此在Mapper接口中重载方法会导致MyBatis无法正确匹配,故不支持方法重载。
755





