获取参数的两种方式 #{} 和 ${} 的区别
#{} 执行的是占位符赋值。将 xx 的参数值提取出来,执行占位符赋值。
${} 执行的是字符串拼接。将 xx 的参数值提取出来,直接替换掉 ${xx}
参数类型非字符串或日期,使用 #{} 和 ${} 实际执行的 SQL 是一样的。
如果是字符串类型参数,${} 需要手动增加单引号
- 一般情况获取参数都用 #{},也即占位符赋值的方式,只有特殊需求不希望 MyBatis 对参数值进行任何加工直接拼接字符串时,才用 ${},例如根据传入的排序字段排序。
MyBatis参数 – 单个参数之简单类型
- parameterType,参数类型,选填,如果不填,MyBatis 会自动识别。
- MyBatis 底层调用 JDBC 的 set 方法,根据参数类型选择对应的 set 方法来设置参数。
MyBatis参数 – 单个参数之 map 集合
MyBatis 读取 map key 为参数赋值,map 的 key 必须和 mapper.xml 文件中的参数名一致。
MyBatis参数 – 单个参数之 POJO 类
MyBatis 通过读取 POJO 对象的属性为参数赋值,POJO 类属性名与 mapper.xml 中的参数名一致。
MyBatis参数 – 多个参数
- MyBatis 处理多个参数时,将多个参数转为 map,以 [arg0, arg1, …] 和 [param1, param2, …] 为 key,依次将方法参数放到参数 map 中,后续流程按单个参数 map 类型处理。
多个参数的 parameterType 是 map
使用 @Param 注解为参数命名
- 使用 @Param 注解,无论参数是单个还是多个,MyBatis 都按多个参数处理,即先将参数转为参数 map。
- 不同的是,使用 @Param 注解,构建的参数 map key 为 [参数1的代号, 参数2的代号, param1, param2]。
- 如果是简单类型,直接使用 @Param 中的名称获取参数值
- 如果是 map 类型,使用 @Param 中的名称获取 map 对象后,再通过 map key 获取参数值
- 如果是 POJO 类型,使用 @Param 中的名称获取 POJO 对象后,再通过 POJO 类属性名获取参数值
实际项目中,推荐使用 @Param 注解为参数命名