1.单个参数:
方法中的参数即为 SQL 语句中的参数,因为只有一个参数,所以即使参数名不统一也能正常执行。
2.多个参数:
mybatis 会做特殊处理,将多个参数封装成一个 map.
- key:param1,param2…paramN
- value:传入的值
- #{} 就是从 map 中获取指定的 key 值
操作:
- 方法:public Employee getEmployeeByIdAndName(Integer id,String lastName);
- 取值:select * from employee where id = #{param1} and last_name = #{param2}
3.命名参数:
明确指定封装参数时 map 的 key: @Param(“id)
多个参数还是会被封装成一个 map:
- key:使用注解 @Param 指定的值
- value:传入的参数值
操作:
- 方法:public Employee getEmployeeByIdAndName(@Param(“id”)Integer id,@Param(“lastName”)String lastName)
- 取值:select * from employee where id = #{id} and last_name = #{lastName}
4.POJO:
- 如果多个参数正好对应我们业务逻辑的数据模型,我们就可以直接传入 pojo;
- #{属性名}:取出 pojo 的属性值
Map:
如果多个参数不是业务模型中的数据,不经常使用,为了方便,我们可以传入一个 map;
#{key}:取出 map 中的值
# 与 $ 取值的区别:
#{}:可以取出参数值或者 pojo 的属性值。
${}:可以取出参数值或者 pojo 的属性值。
区别:
- #{}:是以预编译的形式将参数设置到 sql 中;PreparedStatement,防止 sql 注入。
- ${}:取出的值直接拼接在 sql 语句上,会有安全问题。
一般情况下,获取参数的值,都应该使用 #{}
原生 jdbc 不支持占位符的地方,就可以使用 ${}:
比如分表:按照年份分表查询
select * from ${year}_salary where xxx;
按照某个字段排序:
select * from tb_eamployee order by ${name} ${order}