MyBatis中的参数传递

来源:互联网 发布:java源代码流程图 编辑:程序博客网 时间:2024/06/05 19:10
• 单个参数

– 可以接受基本类型,对象类型,集合类型的值。这种情况MyBatis可直接使用这个参数,不需要经过任何处理。

单个参数情况前面已经讲过很多,这里不再赘述。

• 多个参数
– 任意多个参数,都会被MyBatis重新包装成一个Map传入。Map的key是param1,param2,0,1...,值就是参数的值。

• 命名参数
– 为参数使用@Param起一个名字,MyBatis就会将这些参数封装进map中,key就是我们自己指定的名字

如果需要通过ID和名称字段对数据表进行查找,这时候会自然想到如下的处理方式:

编写SQL映射文件:

<select id="getEmpByIdAndLastName" resultType="com.test.beans.Employee">SELECT * FROM tb1_emplyee WHERE  id=#{id} AND last_name=#{lastName}</select>

对应的接口:

public Employee getEmpByIdAndLastName(String lastName,int id);

测试类:

@Testpublic void test04() throws IOException{SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();//1、获取到的SqlSession不会自动提交数据SqlSession openSession = sqlSessionFactory.openSession();try{EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);Employee employee=mapper.getEmpByIdAndLastName("tom",1);System.out.println(employee);}finally{openSession.close();}}

然而报错了

Error querying database.  Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [0, 1, param1, param2]

原因就是前面讲到的,MyBatis就会将这些参数封装进map中,可以通过@Param注解

public Employee getEmpByIdAndLastName(@Param("lastName") String lastName, @Param("id") int id);
这样,#{}的值才能和传入的参数绑定在一起。

• POJO
– 当这些参数属于我们业务POJO时,我们直接传递POJO

ex:#{属性名}:取出传入的pojo的属性值


• Map
– 我们也可以封装多个参数为map,直接传递

如果多个参数不是业务模型中的数据,没有对应的pojo,为了方便,我们也可以传入map

#{key}:取出map中对应的值

ex:

public Employee getEmpByMap(Map<String,Object> map);

<select id="getEmpByMap" resultType="com.test.beans.Employee">SELECT id,last_name lastName,email,gender from tb1_emplyee where id = #{id}</select>
@Testpublic void test04() throws IOException{SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();//1、获取到的SqlSession不会自动提交数据SqlSession openSession = sqlSessionFactory.openSession();try{EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);Map<String,Object> map=new HashMap();map.put("id",1);map.put("lastName","Tom");Employee employee=mapper.getEmpByMap(map);System.out.println(employee);}finally{openSession.close();}}

如果多个参数不是业务模型中的数据,但是需要经常使用,推荐使用TO(Transfer Object)传输数据对象

Page{

int index;

int size;

}

}

注意:如果是Collection(List,Set)类型或者数组

也是把传入的list传入到Map中。

key:Collection(colliection),如果是List还可以使用key(list),数组(Array)

public Emplyee getEmpById(List<Integer> ids);

取出第一个Id值:#{list[0]}