单个参数:
mybatis不会做特殊从处理,
#{参数名}
,取出参数值
示例:
select * from user where age = #{age};
多个参数:
mybatis会做特殊处理,多个参数会被封装成一个map.
- key:根据接口方法中的参数顺序依次为’param1’,’param2’….
- value:为传入的值
示例:
select * from user where age = #{param1} and sex = #{param2};
命名参数:
明确指定封装参数时的map的key,在接口中定义方法的时候,参数前面加上@ Param(参数名)
- key:使用@ Param注解指定的值
- value:参数值
#{指定的key}
取出对应的参数值
示例:
public List<User> getUserByAgeAndSex(@Param("age") int age,@Param("sex")String sex);
select * from user where age = #{age} and sex = #{sex};
如果多个参数正好是pojo,那么直接传入pojo,取值#{属性名}
示例:
public void addUser(User user);
insert into user(userName,password) values (#{userName},#{password})
如果多个参数不是pojo,不经常使用,为了方便,我们可以直接传入map
#{key}
:取出map中的值
示例:
public List<User> getUserByAgeAndSex(Map<String> map);
//map{age=18,sex="男"}
select * from user where age = #{age} and sex = #{sex};
如果多个参数不是业务模型中的数据,但是经常使用,推荐来编写一个TO(Transfer Object) 数据传输对象
例如分页查询的时候需要传入当前页数和页面大小
Page{
int index;
int size;
}
例题分析
=========================================================================
例子:
public User getUser(@param("id")int id,String userName);
取值:id ==> #{id/param1} userName ==> #{param2}
public User getUser(int id,@Param("u")User user);
取值:id ==> #{param1} userName ==> #{param2.userName/u.userName}
### 特别注意:如果是Collection(List或者Set)类型或者书数组
也会做特殊处理.也就是把传入的集合或者数组封装到一个map中.
key:Collection(collection)如果是List还可以使用key(list)
数组(array)
public User getUserById(List<Integer> ids);
取值:取出第一个id值: #{list[0]}
如果传入的数组,那么就是: #{array[0]}
==============================================================================
参数值得获取
#{}
:是以预编译的形式,将参数设置到sql语句中,类似于PreparedStatement,可以防止sql注入${}
:取出的值直接拼装在sql语句中,这样的话会有安全问题,但是也不是什么情况下都使用#{}来取值当原生jdbc不支持占位符的地方我们就可以使用${}来进行取值:
比如分表,排序
select * from ${year}_salary where ...;
select * from user order by ${} ${};
留言