Mybatis 参数处理

在 MyBatis 中,XML 文件用于定义 SQL 语句,而参数处理是 MyBatis 中非常重要的一部分。MyBatis 支持多种参数类型,包括单参数、多参数、对象类型、List 类型、Map 类型等。此外,MyBatis 还提供了 #{}${} 两种不同的参数占位符。下面详细说明这些内容:


1. 单参数

当 Mapper 接口方法只有一个参数时,可以直接在 XML 文件中使用 #{参数名} 引用。

Mapper 接口

public interface UserMapper {
    User selectUserById(int id);
}

Mapper XML 文件

<select id="selectUserById" resultType="User">
    SELECT * FROM user WHERE id = #{id}
</select>
  • #{id}:这里的 id 是方法参数名,MyBatis 会自动将其替换为传入的参数值。

2. 多参数

当 Mapper 接口方法有多个参数时,可以通过 @Param 注解为参数命名,然后在 XML 文件中引用。

Mapper 接口

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

Mapper XML 文件

<select id="selectUserByNameAndAge" resultType="User">
    SELECT * FROM user WHERE name = #{name} AND age = #{age}
</select>
  • #{name}#{age}:分别对应方法参数中 @Param 注解指定的名称。

3. 对象类型

当参数是一个对象时,可以直接通过 #{属性名} 引用对象的属性。

实体类

public class User {
    private String name;
    private int age;
    // getters and setters
}

Mapper 接口

public interface UserMapper {
    void insertUser(User user);
}

Mapper XML 文件

<insert id="insertUser" parameterType="User">
    INSERT INTO user (name, age) VALUES (#{name}, #{age})
</insert>
  • #{name}#{age}:分别引用 User 对象的 nameage 属性。

4. List 类型

当参数是一个 List 时,通常用于 IN 子句,可以使用 foreach 标签遍历。

Mapper 接口

public interface UserMapper {
    List<User> selectUsersByIds(List<Integer> ids);
}

Mapper XML 文件

<select id="selectUsersByIds" resultType="User">
    SELECT * FROM user WHERE id IN
    <foreach collection="list" item="id" open="(" separator="," close=")">
        #{id}
    </foreach>
</select>
  • collection="list":表示传入的参数是一个 List
  • item="id":表示遍历时的每个元素命名为 id
  • #{id}:引用遍历的每个元素。

5. Map 类型

当参数是一个 Map 时,可以通过 #{key} 引用 Map 中的值。

Mapper 接口

public interface UserMapper {
    User selectUserByMap(Map<String, Object> map);
}

Mapper XML 文件

<select id="selectUserByMap" resultType="User">
    SELECT * FROM user WHERE name = #{name} AND age = #{age}
</select>
  • #{name}#{age}:分别引用 Map 中的 nameage 键对应的值。

6. #{}${} 的区别

#{}:预编译参数

  • 使用 PreparedStatement,参数会被替换为 ?,防止 SQL 注入。
  • 适用于参数值。

示例

<select id="selectUserById" resultType="User">
    SELECT * FROM user WHERE id = #{id}
</select>

${}:直接替换

  • 直接替换为参数值,适用于动态 SQL 片段(如表名、列名等)。
  • 需要注意 SQL 注入问题。

示例

<select id="selectUserByColumn" resultType="User">
    SELECT * FROM user WHERE ${column} = #{value}
</select>
  • ${column}:直接替换为列名。
  • #{value}:预编译参数,替换为 ?

总结

  • 单参数:直接使用 #{参数名}
  • 多参数:使用 @Param 注解为参数命名。
  • 对象类型:使用 #{属性名} 引用对象属性。
  • List 类型:使用 foreach 标签遍历。
  • Map 类型:使用 #{key} 引用 Map 中的值。
  • #{}${}#{} 用于参数值,${} 用于动态 SQL 片段。
posted @   CyrusHuang  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示