MyBatis 和 MyBatis-Plus 中对同一命名空间(namespace)中相同 id
的处理逻辑是在解析mapper文件时进行的。如果在同一命名空间中有两个或更多具有相同 id
的映射语句,MyBatis 和 MyBatis-Plus 会在启动时抛出异常,因为它们需要保证每个 id
在每个命名空间中是唯一的。
源码层面,MyBatis 和 MyBatis-Plus 在解析 mapper 文件时会将其映射语句存储在内存中的一个映射结构中,并在此过程中检查 id
的唯一性。如果发现重复的 id
,它们会抛出异常。
以下是一个简化的代码片段,演示了如何在 MyBatis 中检查 id
的唯一性:
public class MapperRegistry {
private final Configuration config;
private final Map<String, MapperProxyFactory<?>> knownMappers = new HashMap<>();
public <T> void addMapper(Class<T> type) {
if (type.isInterface()) {
if (hasMapper(type)) {
throw new BindingException("Type " + type + " is already known to the MapperRegistry.");
}
boolean loadCompleted = false;
try {
knownMappers.put(type.toString(), new MapperProxyFactory<>(type));
// 解析 Mapper 接口的注解
// ...
loadCompleted = true;
} finally {
if (!loadCompleted) {
knownMappers.remove(type.toString());
}
}
}
}
private boolean hasMapper(Class<?> type) {
return knownMappers.containsKey(type.toString());
}
// ...
}
在 MyBatis-Plus 中,处理方式类似,也是在解析 mapper 文件时进行检查,保证每个 id
在同一命名空间中的唯一性。如果需要进一步分析具体实现,需要查看 MyBatis-Plus 的相关源码。