mapper接口传递参数时遵循以下规则
1、如果传递过来是单参数,且没有以@Param注解进行命名,则直接将单参数作为真实的参数调用SqlSession的对应方法。
2、如果传递过来的不是单参数或者是包含以@Param注解进行命名的参数,则会将对应的参数转换为一个Map进行传递。具体规则如下:
2.1、 会把对应的参数按照顺序以param1、param2、paramN这样的形式作为Key存入目标Map中,第一个参数是param1,第N个参数是paramN。
2.2、 如果参数是以@Param注解命名的参数,则以@Param指定的名称作为Key存入目标Map中。
2.3、 如果参数不是以@Param注解命名的,则按照顺序以0、1、N这样的形式作为Key存入目标Map中,第一个参数是0,第N个参数是N。
所以在xml中使用mapper接口传递的变量时
1. 传递单参数, 未使用@Param注解, 在xml中使用#{变量名}方式获取; 如果单参数是Map或者Bean类型, 则可以#{属性名}来获取Map或者Bean中的各个属性
例如 void list(String name) => where name = #{name}
void list(Map<String, Object> map) => where id=#{id} and name=#{name} *id和name为map中的key值
2.1 设置了@Param注解, 如果未设置Param的名称, 则默认赋予变量对应新名称是Param1~ParamN, 则在xml中使用#{Param1}~#{ParamN}来使用; 如果变量是Map或者Bean类型, 则是#{Param1.属性名}~#{ParamN.属性名}来获取不同Map或者Bean中的各个属性
2.2 如果在使用@Param注解时设置了@Param("name")之类的名称, 则相对2.1中, Param1~ParamN改为用户设置的"name"等去对应相应变量, 个人常用这种
例如 void list(@Param("id") int id, @Param("newName") String name, @Param("petBean") PetBean petBean)
=>
where id = #{id} and name=#{newName} and cat_name = #{petBean.catName} and dog_name = #{petBean.dogName}
2.3 多个变量且没有使用@Param注解, 则在xml中使用#{0}, #{1}~#{N}的方式去获取, 这种会比较不清楚, 不推荐
在mapper接口需要传递多个参数的情况下, 建议用@Param注解