单个参数:

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 ${} ${};

最后修改日期:2020-07-13

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。