MyBatis 方法参数

129 阅读1分钟

获取参数的两种方式 #{} 和 ${} 的区别

#{} 执行的是占位符赋值。将 xx 的参数值提取出来,执行占位符赋值。

${} 执行的是字符串拼接。将 xx 的参数值提取出来,直接替换掉 ${xx}

image.png

image.png

参数类型非字符串或日期,使用 #{} 和 ${} 实际执行的 SQL 是一样的。

如果是字符串类型参数,${} 需要手动增加单引号

image.png

image.png

  • 一般情况获取参数都用 #{},也即占位符赋值的方式,只有特殊需求不希望 MyBatis 对参数值进行任何加工直接拼接字符串时,才用 ${},例如根据传入的排序字段排序。

image.png

MyBatis参数 – 单个参数之简单类型

image.png

image.png

image.png

  • parameterType,参数类型,选填,如果不填,MyBatis 会自动识别。
  • MyBatis 底层调用 JDBC 的 set 方法,根据参数类型选择对应的 set 方法来设置参数。

MyBatis参数 – 单个参数之 map 集合

image.png

image.png

image.png

MyBatis 读取 map key 为参数赋值,map 的 key 必须和 mapper.xml 文件中的参数名一致。

MyBatis参数 – 单个参数之 POJO 类

image.png

image.png

image.png

MyBatis 通过读取 POJO 对象的属性为参数赋值,POJO 类属性名与 mapper.xml 中的参数名一致。

MyBatis参数 – 多个参数

image.png

  • MyBatis 处理多个参数时,将多个参数转为 map,以 [arg0, arg1, …] 和 [param1, param2, …] 为 key,依次将方法参数放到参数 map 中,后续流程按单个参数 map 类型处理。

image.png

image.png

多个参数的 parameterType 是 map

使用 @Param 注解为参数命名

image.png

  • 使用 @Param 注解,无论参数是单个还是多个,MyBatis 都按多个参数处理,即先将参数转为参数 map。
  • 不同的是,使用 @Param 注解,构建的参数 map key 为 [参数1的代号, 参数2的代号, param1, param2]。

image.png

  • 如果是简单类型,直接使用 @Param 中的名称获取参数值

image.png

  • 如果是 map 类型,使用 @Param 中的名称获取 map 对象后,再通过 map key 获取参数值

image.png

  • 如果是 POJO 类型,使用 @Param 中的名称获取 POJO 对象后,再通过 POJO 类属性名获取参数值

image.png

实际项目中,推荐使用 @Param 注解为参数命名