一、
当传入一个参数时,mybatis直接把输入的参数绑定到#{}
中的变量中。但是mybatis如何处理传入多个参数的情况呢?
例如一个库表users,有id、name、age三个字段,现在通过传入id、name两个参数来查询整条记录。对应的接口如下:
public interface UserDao {
/*接口中出入两个参数,mybatis要处理两个输入参数*/
public User getUser(int id, String name);
}
那么mybatis如何处理传入多个参数呢?传入多个参数时,多个参数会被封装成一个map,map的键分别对应param1、param2 …… paramN,或者map的键对应0、1 …… N,而键对应的value值才是接口中传入的数据。
例如上面接口传入的是id,name两个变量,假设两个变量对应的值分别为 1和”Tom”,这两个变量会被封装成一个map,即{“param1” : 1; “param2” : “Tom”}或者{“0” : 1; “1” : “Tom”},name在sql的映射文件中处理传入的这两个参数时,不能用下面的形式,否则会报sql语句绑定错误:
<select id="getUser" resultType="com.lzj.mybaits.bean.User">
select * from users where id=#{id} and name=#{name}
</select>
因为传入的map中根本不存在id和name的键,而应该写成:
<select id="getUser" resultType="com.lzj.mybaits.bean.User">
select * from users where id=#{0} and name=#{1}
</select>
或者写成:
<select id="getUser" resultType="com.lzj.mybaits.bean.User">
select * from users where id=#{param1} and name=#{param2}
</select>
注意在写上面的语句中,可以不用parameterType定义输入的类型,因为mybatis会自动映射类型,但是一定要定义返回类型,例如用resultType指定。
二、
当mybatis处理多个传入参数时,用上面的方式不容易分辨,也可以在mybatis中使用命名的键,要用@Param注解来实现,接口应该定义成如下:
public interface UserDao {
/*@Param注解可以指定映射到mybatis中的键的名字*/
public User getUser(@Param("id") int id, @Param("name") String name);
}
在mybatis中的映射文件中就可以通过id和name的键来获取输入的参数值了,像下面的形式:
<select id="getUser" resultType="com.lzj.mybaits.bean.User">
select * from users where id=#{id} and name=#{name}
</select>
三、
当传入的参数较多时,建议传入一个POJO或者一个map对象,mybatis处理时可以直接通过#{}获取pojo中属性的值或者获取map中键的值。
四、
当接口中既传入了基本类型,又传入了自定义的对象类型,例如如下形式
public interface UserDao {
public User getUser(@Param("id") int id, @Param("us") User user);
}
在mybatis处理映射文件时,mybatis会把id和user封装到一个map中,可以通过#{param1},#{param2.id},#{param2.name},#{param2.age}来获取输入的值。 还可以通过#{id},#{us.id},#{us.name},#{us.age}来获取传入的参数值。
五、
如果接口中传入的是Collection类型的(包括List和Set)或者数组类型的,也会被封装成map类型的。
例如如果传入的是Collection类型的(包括List和Set),在mybatis中可以通过collection键来获取输入的值,#{collection},当然如果还是List类型的,还可以通过#{list}来获取。
如果接口传入的是数组类型的,在mybatis中可以通过#{array}来获取输入的参数。
例如接口为
public interface UserDao {
public User getUser(List<Integer> usersList);
}
在mybatis中获取接口中输入的数据时,可以通过下面的形式:#{list[0]}、#{list[1]}、{list[2]} …… {list[n]}。当然也可以通过@Param注解更改键的默认名字。