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 片段。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具