Mybatis XML 中参数配置与传递详解

更新时间:2024-04-24 15:58:43   人气:8964
在 MyBatis 框架中,XML 映射文件扮演着至关重要的角色。其中一个重要方面是参数的配置和传递机制,它允许我们在 SQL 语句执行过程中动态地绑定变量值。

### **一、参数类型**

MyBatis 支持多种类型的参数映射:

1. **简单类型(Primitive Types & Wrapper Classes)**:如 `int`, `String` 等基本数据类型以及它们对应的包装类,在 XML 文件中的 `<parameter>` 标签内通过 `javaType` 属性指定具体的 Java 类型,并使用 `${}` 或者 `$#{}` 占位符来引用参数名。

xml

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


2. **POJO 对象(Plain Old Java Object)**: 当需要传入包含多个属性的对象时,可以将整个对象作为参数进行传递,MyBatis会自动匹配并注入所有字段到SQL查询条件中。

xml

<update id="updateUserInfo" parameterType="com.example.UserDO">
UPDATE users SET username=#{username}, email=#{email} where id=#{id};
</update>


3. **Map集合**: 另一个灵活的选择是在方法调用时传入 Map 集合,键即为占位符名称,值则对应实际的数据项。

xml

<insert id="insertUserWithMapParams">
INSERT INTO users(username,email) VALUES(#{userName,jdbcType=VARCHAR}, #{userEmail,jdbcType=VARCHAR})
</insert>


4. **注解式处理器@Param** : 在接口的方法定义处利用 @Param 注解明确指明每个参数的名字以便于在 Mapper.xml 中准确关联。

5. **数组或 List 列表**:对于批量操作,可直接以数组或者List形式接收参数并在Mapper xml中遍历处理。

xml

<foreach item="item" index="index" collection="list" open="" separator="," close="">
#{item.value},
</foreach>


### **二、参数传递方式的区别 - #{} 和 ${}**
- **#{} (预编译)**: 这种语法会在运行前由数据库驱动程序对 SQL 命令做字符串替换及预编译处理,能够有效防止 SQL 注入攻击且性能更好。例如:

sql

SELECT * FROM table_user WHERE name = #{name}


- **${} (文本拼接)**: 直接把表达式的值插入 SQL 字符串中而不经过任何转义或其他编码格式化。这种方式虽然方便但容易导致 SQL 注入问题,因此推荐仅用于非用户输入的部分,比如静态常量等场景。

sql

SELECT * FROM table_user WHERE name = '${static_name}'


总结来说,Mybatis 的 XML 参数配置与传递功能提供了高度灵活性的同时也确保了安全性。开发者可以根据具体业务需求选择合适的参数类型及其传递方式进行定制化的 SQL 查询构建,从而实现高效而安全的数据交互管理。