一.标签作用
1.0MyBatis总体机制

1.1 @Mapper标签(声明持久化层组件)
1.1.1 @Mapper标签作用
标记为MyBatis的Mapper接口,Spring Boot自动创建代理实现类。
1.1.2 在对应的resource文件夹建立对应Mapper包,并赋值namespace


1.1.3 配置 Mapper 配置文件位置
Spring Boot 默认无法自动识别resources/mapper下的 XML 文件,需在application.properties中显式指定路径:
# MyBatis配置:指定Mapper XML文件的存储路径
mybatis.mapper-locations=classpath:/mapper/*Mapper.xml
# 可选优化:开启驼峰命名自动映射(tiger_id → tigerId),可省略SQL中的AS别名
mybatis.configuration.map-underscore-to-camel-case=true
classpath:/mapper/*Mapper.xml:匹配resources/mapper目录下所有以Mapper.xml结尾的文件,批量加载所有 Mapper 配置。
1.2 打印执行日志
XML
logging.level.com.example.demo.mapper=debug

1.3@Param标签
1.3.1、核心定位:给参数 "起名字",解决多参数引用问题
MyBatis 默认情况下:
- 单参数 :无需命名,XML 中用
#{任意名}(如#{id}/#{param})都能匹配; - 多参数 :参数名会被 MyBatis 重命名为
param1、param2...(失去原名称),直接用#{username}会报错Parameter 'username' not found。
而@Param的作用就是:为每个参数指定一个自定义名称,让 XML / 注解 SQL 中能通过这个名称精准引用参数。
1.3.2、核心使用场景(3 种高频场景)
场景 1:多简单类型参数(必用 @Param)
这是最常用的场景,比如传入username和status两个简单类型参数:
java
运行
// Mapper接口:用@Param给每个参数命名
UserDO selectByUsernameAndStatus(
@Param("username") String username, // 命名为username
@Param("status") Integer status // 命名为status
);
xml
<!-- XML:直接用@Param的名称引用,无需parameterType -->
<select id="selectByUsernameAndStatus" resultMap="BaseResultMap">
SELECT * FROM user
WHERE username = #{username} AND status = #{status}
</select>
场景 2:多复杂类型参数(必用 @Param)
传入UserDO和OrderDO两个复杂对象,通过@Param命名后,可引用对象的属性:
java
运行
// Mapper接口:给复杂对象命名
List<RecordDO> selectByUserAndOrder(
@Param("user") UserDO userDO, // 命名为user
@Param("order") OrderDO orderDO // 命名为order
);
xml
<!-- XML:通过"命名.属性名"引用复杂对象的字段 -->
<select id="selectByUserAndOrder" resultMap="RecordResultMap">
SELECT * FROM record
WHERE user_id = #{user.id} <!-- 引用UserDO的id -->
AND order_no = #{order.orderNo} <!-- 引用OrderDO的orderNo -->
</select>
场景 3:混合参数(简单 + 复杂,必用 @Param)
传入pageNum(简单类型)+UserDO(复杂类型),统一命名:
java
运行
// Mapper接口:混合参数命名
List<UserDO> selectPage(
@Param("pageNum") Integer pageNum, // 简单类型
@Param("user") UserDO userDO // 复杂类型
);
xml
<!-- XML:分别引用不同命名的参数 -->
<select id="selectPage" resultMap="BaseResultMap">
SELECT * FROM user
WHERE username LIKE CONCAT('%', #{user.username}, '%')
LIMIT #{pageNum}, 10
</select>
三、不用 @Param 的例外场景(仅 2 种)
并非所有场景都需要 @Param,这 2 种情况可省略:
1. 单参数(无论简单 / 复杂类型)
java
运行
// 单参数:无需@Param
UserDO selectById(Long id);
// XML直接用#{id}即可,MyBatis自动匹配
2. 单参数是 Map(用 Map 的 key 作为参数名)
java
运行
// 单参数是Map:无需@Param
List<UserDO> selectByMap(Map<String, Object> paramMap);
xml
<!-- XML用Map的key引用,如paramMap中有"username"键 -->
<select id="selectByMap" resultMap="BaseResultMap">
SELECT * FROM user WHERE username = #{username}
</select>
四、关键语法规则(避坑核心)
- 注解位置 :必须加在 Mapper 接口方法的参数前 ,如
@Param("username") String username; - 参数名大小写 :XML 中引用时和 @Param 的名称大小写一致(如 @Param ("UserName") → #{UserName});
- 特殊字符 :参数名不能含特殊字符(如
@Param("user-name")会报错),建议用驼峰(userName)或下划线(user_name); - 和 parameterType 的关系 :加了 @Param 后,XML 中无需写 parameterType(写了也无效)。
五、新手常见坑
- 多参数忘加 @Param :报错
Parameter 'xxx' not found,解决方案:补加 @Param; - 参数名拼写错误:如 @Param ("username") → XML 中写 #{userName},解决方案:核对名称大小写和拼写;
- 复杂对象引用错误:如 @Param ("user") → XML 中写 #{userId}(正确是 #{user.id}),解决方案:用 "命名。属性名" 引用。
总结
@Param的核心作用是给多参数命名,让 XML / 注解 SQL 能精准引用参数名;- 必用场景:多参数(无论简单 / 复杂 / 混合类型);
- 不用场景:单参数(简单 / 复杂 / Map);
- 加了 @Param 后,XML 中无需写 parameterType,MyBatis 自动识别参数类型。
二.配置需要注意的事项
2.1数据库名在没有驼峰自动映射的时候,必须As起的别名和entities保持一致

