命名空间必须与Mapper接口全限定类名完全一致,如com.example.mapper.UserMapper;SQL标签id须与接口方法名严格一致;parameterType和resultType需匹配参数与返回类型。

MyBatis 的 Mapper.xml 文件中,命名空间(namespace)必须与对应 Mapper 接口的**全限定类名完全一致**,SQL 语句通过 <select>、<insert>、<update>、<delete> 标签定义,每条语句的 id 必须与接口中方法名相同。
命名空间怎么写?
命名空间不是随便起的,它本质是“定位这个 XML 对应哪个 Java 接口”。必须严格匹配 Mapper 接口的完整包路径 + 类名:
- 接口定义:
com.example.mapper.UserMapper - 对应 XML 的 namespace:
com.example.mapper.UserMapper - 不能写成
userMapper、UserMapper.xml或漏掉包名 - 如果 namespace 错了,MyBatis 启动时可能不报错,但运行时调用方法会抛
BindingException
SQL 语句怎么写?id 和参数怎么对应?
每个 SQL 标签的 id 就是接口里方法的名字,参数类型由 parameterType 指定(可省略,MyBatis 能自动推断),返回类型用 resultType 或 resultMap 声明:
-
单参数(如 int、String):直接在 SQL 中用
#{id}或#{value}引用 -
多个参数或对象:推荐传一个 POJO(如
User),SQL 中用#{username}、#{age}引用其属性 -
使用 Map 传参:用
#{keyName}引用 map 的 key -
动态 SQL(如条件查询):配合
<if>、<where>、<foreach>等标签使用
示例(查用户):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
<select id="selectById" resultType="com.example.entity.User">SELECT * FROM user WHERE id = #{id}
</select>
resultMap 怎么配合复杂映射?
当数据库字段名和 Java 属性名不一致,或需要关联查询(一对多、多对一)时,要用 <resultMap> 显式配置映射关系:
-
id是 resultMap 的唯一标识,SQL 中通过resultMap="userResultMap"引用 -
<id>标签映射主键字段(提升性能),<result>映射普通字段 - 字段别名(AS)在 SQL 中写清楚,或用
column/property明确指定
示例:
<resultMap id="userResultMap" type="com.example.entity.User"><id column="user_id" property="id"/>
<result column="user_name" property="username"/>
</resultMap>
<select id="selectByName" resultMap="userResultMap">
SELECT id AS user_id, name AS user_name FROM user WHERE name = #{name}
</select>
常见易错点提醒
- XML 文件名建议和接口名一致(如
UserMapper.java→UserMapper.xml),并放在相同包路径下(或按 MyBatis 配置的 resource 路径) - SQL 标签里的
id区分大小写,必须和接口方法名 100% 一致 -
parameterType不强制写,但写上更清晰;resultType和resultMap二选一,不能同时用 - 注意 XML 头声明和 DTD 引用是否正确(MyBatis 3.4+ 推荐用 XSD)

















