Mybatis接口方法参数不加@Param,照样流畅取值

2,736 阅读2分钟

在 MyBatis 中,如果 Mapper 接口的方法有多个参数,但没有使用 @Param 注解,默认情况下,MyBatis 会将这些参数放入一个 Map 中,键名为 param1param2 等,或者使用索引 01 等来访问。以下是具体的使用方法和注意事项。


一、Mapper 接口方法

假设有一个 Mapper 接口方法,包含多个参数但没有使用 @Param 注解:

public interface UserMapper {
    User selectUserByNameAndAge(String name, int age);
}

二、XML 文件中的参数引用

在 XML 文件中,可以通过以下方式引用参数:

1. 使用 param1param2 等

MyBatis 会自动为参数生成键名 param1param2 等:

<select id="selectUserByNameAndAge" resultType="User">
  SELECT * FROM user WHERE name = #{param1} AND age = #{param2}
</select>

2. 使用索引 01 等

也可以通过索引 01 等来引用参数:

<select id="selectUserByNameAndAge" resultType="User">
  SELECT * FROM user WHERE name = #{0} AND age = #{1}
</select>

三、注意事项

  1. 可读性问题

    • 使用 param1param2 或索引 01 的方式可读性较差,容易混淆。
    • 建议使用 @Param 注解明确参数名称。
  2. 参数顺序问题

    • 如果参数顺序发生变化,XML 文件中的引用也需要同步修改,容易出错。
  3. 推荐使用 @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 注解,可以通过 param1param2 或索引 01 等方式引用参数。
  • 这种方式可读性较差,容易出错,推荐使用 @Param 注解明确参数名称。
  • 使用 @Param 注解后,XML 文件中的参数引用会更加清晰和易于维护。