其实也很简单。在默认命名方式( MyBatis多参数传递之默认命名方式示例 )一文中,介绍了MyBatis对参数的默认命名,这种命名在这种情况下依然有效。我们需要做的,就是如何根据这个命名读出Map中的参数值。这里就采用 这种方式来实现教师分页查询。先修改映射器接口(TeacherMapper.java)中的教师分页查询方法的声明如下(完整源码下载: http://down.51cto.com/data/742758 ):
- //分页查询教师信息
- public List<Teacher> findTeacherByPage(
- Map params, //查询条件
- int start, //起始记录
- int limit //记录条数
- );
(代码1)
那么MyBatis将会对此方法的三个参数依次命名为param1、param2和param3,其中第一个参数为Map类型,后两个参数为int类型。
执行类(CollectionDemo.java)中的查询代码片段如下:
- Map<String, Object> params =
- new HashMap<String, Object>();
- //以name字段升序排序,
- params.put( "sort" , "name" );
- params.put( "dir" , "asc" );
- //查询职称为教授或副教授的教师
- params.put( "title" , "%教授" );
- //查询教师分页信息
- List<Teacher> teachers =
- //以name字段升序排序,从第0条记录开始查询。
- //查询2条记录
- mapper.findTeacherByPage(params, 0 , 2 );
(代码2)
相应的映射配置(TeacherMapper.xml)文件片段如下:
- < select id = "findTeacherByPage" resultMap = "supervisorResultMap" >
- select * from teacher where teacher.title like
- #{param1.title} order by ${param1.sort} ${param1.dir} limit #{param2},#{param3}
- </ select >
(代码3)
在以上的映射文件中,使用#{param1.title}的形式就能访问Map中title属性的值。当然,在order by子句中应使用${param1.sort}的形式(可参见本系列博文中的“ MyBatis多参数传递之注解方式示例 ”一文,第二部分“可能会遇到的错误”第一个就是关于order by的。不过经笔者验证,在本例中使用“#”也是可以的)。由此我们可以总结出,我们使用#{参数默认命名.属性名}的形式,就可以在映射文件访问Map参数的属性值。
显然,如果使用注解的方式,给参数指定名称(关于注解方式传递多个参数,请参考本系列的博文: MyBatis多参数传递之注解方式示例 ),亦可使用上述形式来访问Map中的属性值,在此不再赘述(采用注解时,访问Map中的属性的源码,请到此处下载: http://down.51cto.com/data/742780 )。