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对象的name和age属性。
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中的name和age键对应的值。
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 片段。

浙公网安备 33010602011771号