在 MyBatis 中,如果 Mapper 接口的方法有多个参数,但没有使用 @Param 注解,默认情况下,MyBatis 会将这些参数放入一个 Map 中,键名为 param1、param2 等,或者使用索引 0、1 等来访问。以下是具体的使用方法和注意事项。
一、Mapper 接口方法
假设有一个 Mapper 接口方法,包含多个参数但没有使用 @Param 注解:
public interface UserMapper {
User selectUserByNameAndAge(String name, int age);
}
二、XML 文件中的参数引用
在 XML 文件中,可以通过以下方式引用参数:
1. 使用 param1、param2 等
MyBatis 会自动为参数生成键名 param1、param2 等:
<select id="selectUserByNameAndAge" resultType="User">
SELECT * FROM user WHERE name = #{param1} AND age = #{param2}
</select>
2. 使用索引 0、1 等
也可以通过索引 0、1 等来引用参数:
<select id="selectUserByNameAndAge" resultType="User">
SELECT * FROM user WHERE name = #{0} AND age = #{1}
</select>
三、注意事项
-
可读性问题:
- 使用
param1、param2或索引0、1的方式可读性较差,容易混淆。 - 建议使用
@Param注解明确参数名称。
- 使用
-
参数顺序问题:
- 如果参数顺序发生变化,XML 文件中的引用也需要同步修改,容易出错。
-
推荐使用
@Param注解:-
使用
@Param注解可以为参数指定名称,提高代码可读性和可维护性。public interface UserMapper { User selectUserByNameAndAge(@Param("name") String name, @Param("age") int age); }XML 文件:
<select id="selectUserByNameAndAge" resultType="User"> SELECT * FROM user WHERE name = #{name} AND age = #{age} </select>
-
四、示例代码
1. Mapper 接口
public interface UserMapper {
User selectUserByNameAndAge(String name, int age);
}
2. XML 文件
<select id="selectUserByNameAndAge" resultType="User">
SELECT * FROM user WHERE name = #{param1} AND age = #{param2}
</select>
或者:
<select id="selectUserByNameAndAge" resultType="User">
SELECT * FROM user WHERE name = #{0} AND age = #{1}
</select>
3. 测试代码
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.selectUserByNameAndAge("John", 25);
System.out.println(user);
sqlSession.close();
- 如果 Mapper 接口方法有多个参数且没有使用
@Param注解,可以通过param1、param2或索引0、1等方式引用参数。 - 这种方式可读性较差,容易出错,推荐使用
@Param注解明确参数名称。 - 使用
@Param注解后,XML 文件中的参数引用会更加清晰和易于维护。