mybatis映射文件中namespace必须与mapper接口全限定名严格一致,与sql标签id组合成全局唯一标识(如com.example.mapper.usermapper.selectbyid),用于动态代理绑定和sql定位;不匹配将导致bindingexception。

MyBatis 映射文件中的 namespace 是定位 SQL 语句的唯一标识,它和 SQL 语句的 id 组合起来,构成全局唯一的语句引用路径(如 com.example.mapper.UserMapper.selectById),是 MyBatis 执行 SQL 的关键寻址依据。
namespace 必须与 Mapper 接口全限定名一致
这是最常见也最重要的约定。当你使用接口式开发(推荐方式)时,namespace 必须等于对应 Mapper 接口的完整类名。MyBatis 会自动将该 namespace 下的每个 <select></select>、<insert></insert> 等标签的 id 值,拼接到 namespace 后面,形成方法签名的匹配依据。
- 接口定义:
public interface UserMapper { User selectById(Long id); } - 映射文件 namespace:
<mapper namespace="com.example.mapper.UserMapper"></mapper> - SQL 标签 id:
<select id="selectById" ...></select> - 最终解析为:
com.example.mapper.UserMapper.selectById→ 对应接口中selectById方法
namespace 用于区分同名 id,避免冲突
不同映射文件可以有相同的 id(比如多个 mapper 都有 selectAll),只要 namespace 不同,就不会冲突。MyBatis 全局语句缓存和执行调度都依赖这个完整路径,而不是孤立的 id。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
com.example.mapper.UserMapper.selectAllcom.example.mapper.OrderMapper.selectAll- 二者可共存,调用时通过接口类型或全路径明确指定
namespace 不匹配会导致运行时异常
如果 namespace 写错(比如少个包名、大小写错误、拼写错误),MyBatis 在启动时可能不报错,但调用对应 Mapper 方法时会抛出 BindingException,提示 “Invalid bound statement (not found)” —— 因为找不到匹配的 statement。
- 检查点:IDE 中 mapper 接口和 XML 文件是否在相同包路径下
- 检查点:XML 文件是否被正确加载(确认 resources 目录结构及 Maven 的
resources配置) - 检查点:namespace 值是否严格等于接口全限定名(包括大小写)
不使用接口时,namespace 仍需唯一,但作用变为逻辑分组
若采用 SqlSession 直接调用(如 sqlSession.selectOne("com.example.mapper.UserMapper.selectById")),namespace 就是手动指定的前缀部分。此时它虽不绑定接口,但仍需保证全局唯一,且建议仍按包+类名风格命名,便于维护和排查。
- 不推荐省略 namespace 或设为随意字符串(如 "abc"),否则难以管理
- 即使不用接口,namespace + id 的组合仍是 MyBatis 内部查找 Statement 的唯一键
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










