• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

奋斗的软件工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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. 注意事项

  1. 单个参数:

    • 可以使用任意变量名接收参数,但建议使用与参数名一致的变量名。
  2. 多个参数:

    • 推荐使用 @Param 注解为参数命名,避免使用参数索引或位置。
  3. POJO 参数:

    • XML 中的参数名必须与 POJO 类中的属性名一致。
  4. Map 参数:

    • XML 中的参数名必须与 Map 中的键名一致。

7. 总结

MyBatis 提供了多种方式来处理 SQL 语句的入参,开发者可以根据实际情况选择合适的方式:

  • 单个参数:简单直接,使用任意变量名接收,建议使用 @Param 注解为参数命名。
  • 多个参数:推荐使用 @Param 注解为参数命名,避免参数索引或位置的混乱。
  • POJO 参数:通过属性名直接访问对象的属性。
  • Map 参数:通过键名直接访问 Map 中的值。

通过合理地配置 parameterType 和使用注解,可以大大提高 MyBatis 的开发效率和代码的可维护性。同时,在使用 ${} 进行 SQL 拼接时,务必注意 SQL 注入问题,推荐使用 #{} 或 concat 函数来避免潜在的安全风险。


希望本文能帮助您更好地理解和使用 MyBatis 的入参配置。如果您有任何问题或建议,欢迎留言讨论!

posted on 2024-12-12 13:37  周政然  阅读(177)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3