MyBatis映射文件配置:入参详解
MyBatis 映射文件配置与参数传递详解
MyBatis 是一款优秀的持久层框架,它简化了数据库操作的复杂性,尤其是在处理 SQL 语句和 Java 对象之间的映射时。在 MyBatis 中,映射文件的配置是非常重要的一部分,尤其是如何正确地处理 SQL 语句的入参。本文将详细介绍 MyBatis 映射文件中入参的配置方式,并结合参数传递的最佳实践,帮助开发者更好地理解和使用 MyBatis。
1. parameterType 属性
在 MyBatis 的映射文件中,parameterType 属性用于指定 SQL 语句的入参类型。虽然这个属性是可选的,但在某些情况下,明确指定参数类型可以帮助 MyBatis 更好地处理参数。
- 可选性:MyBatis 可以通过类型处理器(TypeHandler)自动推断参数类型,因此
parameterType属性是可选的。 - 支持的参数类型:
- 基本数据类型(如
int、String等) - 包装类(如
Integer、String等) - 实体类(POJO)
- Map
- 基本数据类型(如
2. 基本类型参数传递
2.1 单个参数
在 MyBatis 中,如果方法只接收一个基本类型的参数,MyBatis 底层不会做特殊处理,可以直接使用任意变量名来接收参数。
User queryById(Integer id);
在 Mapper XML 中,可以使用 #{abc} 来接收参数:
<select id="queryById" resultType="User" parameterType="int">
SELECT * FROM user WHERE id = #{abc}
</select>
最佳实践:建议使用与参数名一致的变量名,以提高代码的可读性。
2.2 多个参数
当方法接收多个参数时,MyBatis 底层会将参数存储到一个 Map 集合中。Map 的 key 有两种形式:arg0, arg1, ... 或 param1, param2, ...。
User queryByUsernameAndSex(@Param("username") String username, @Param("sex") String sex);
在 Mapper XML 中,可以通过以下方式获取参数:
<select id="queryByUsernameAndSex" resultType="User">
SELECT * FROM user WHERE username = #{param1} AND sex = #{param2}
</select>
或者使用命名参数:
<select id="queryByUsernameAndSex" resultType="User">
SELECT * FROM user WHERE username = #{username} AND sex = #{sex}
</select>
最佳实践:推荐使用命名参数的方式,代码可读性更高。
3. 复杂类型参数传递
3.1 POJO 类型
当参数是一个 POJO 对象时,MyBatis 会直接使用 POJO 的属性来封装数据。
User queryByUser(User user);
在 Mapper XML 中,可以通过 #{属性名} 来获取 POJO 的属性值:
<select id="queryByUser" resultType="User">
SELECT * FROM user WHERE username = #{username} AND sex = #{sex}
</select>
3.2 Map 类型
当参数是一个 Map 集合时,MyBatis 会直接使用 Map 中的键值对来封装参数。
User queryByMap(Map<String, String> map);
在 Mapper XML 中,可以通过 #{key} 来获取 Map 中的值:
<select id="queryByMap" resultType="User">
SELECT * FROM user WHERE username = #{username} AND sex = #{sex}
</select>
4. #{} 与 ${} 的区别
4.1 相同点
#{} 和 ${} 都可以用来获取传入的命名参数。
4.2 不同点
-
#{}:以预编译的方式将参数设置到 SQL 语句中,能够防止 SQL 注入,并且可以自动添加单引号。<select id="queryById" resultType="User"> SELECT * FROM user WHERE id = #{id} </select> -
${}:直接将参数拼接到 SQL 语句中,不能防止 SQL 注入,也不会自动添加单引号。<select id="queryByOrder" resultType="User"> SELECT * FROM user ORDER BY ${orderBy} </select>
4.3 具体应用场景
#{}:用于获取 SQL 语句中的条件参数,推荐使用。${}:用于 SQL 语句的拼接和读取配置文件。
5. 避免 SQL 注入的解决方案
在某些场景下,我们既需要拼接 SQL 语句,又需要避免 SQL 注入。此时可以使用 MySQL 自带的 concat 函数来实现字符串拼接。
SELECT * FROM user WHERE user_name LIKE CONCAT('%', #{userName}, '%')
假设 #{userName} 获取的值是 喆,那么最终生成的 SQL 语句为:
SELECT * FROM user WHERE user_name LIKE '%喆%'
这种方式既保证了 SQL 语句的灵活性,又避免了 SQL 注入的风险。
6. 注意事项
-
单个参数:
- 可以使用任意变量名接收参数,但建议使用与参数名一致的变量名。
-
多个参数:
- 推荐使用
@Param注解为参数命名,避免使用参数索引或位置。
- 推荐使用
-
POJO 参数:
- XML 中的参数名必须与 POJO 类中的属性名一致。
-
Map 参数:
- XML 中的参数名必须与
Map中的键名一致。
- XML 中的参数名必须与
7. 总结
MyBatis 提供了多种方式来处理 SQL 语句的入参,开发者可以根据实际情况选择合适的方式:
- 单个参数:简单直接,使用任意变量名接收,建议使用
@Param注解为参数命名。 - 多个参数:推荐使用
@Param注解为参数命名,避免参数索引或位置的混乱。 - POJO 参数:通过属性名直接访问对象的属性。
- Map 参数:通过键名直接访问
Map中的值。
通过合理地配置 parameterType 和使用注解,可以大大提高 MyBatis 的开发效率和代码的可维护性。同时,在使用 ${} 进行 SQL 拼接时,务必注意 SQL 注入问题,推荐使用 #{} 或 concat 函数来避免潜在的安全风险。
希望本文能帮助您更好地理解和使用 MyBatis 的入参配置。如果您有任何问题或建议,欢迎留言讨论!
浙公网安备 33010602011771号