在本系列文章的《MyBatis多参数传递之Map方式示例》一文中,网友mashiguang提问如下的方法如何传递参数:public List findStudents(Map conditions, int page, int pageSize)。这是一种混合形式,亦即既有Map类型的参数,也有类似int这种普通类型的参数。经过一番摸索,笔者还比较顺利地找到了这种情况的处理方法。
其实也很简单。在默认命名方式(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)文件片段如下:
<selectid="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)。
总结:在《关于该不该上JAVA培训班的一点看法》一文中,笔者提出的学习方法之一是“善于猜想”。而本次问题的解决,笔者并没有找到相关的参考资料,只是凭借着自己的猜想和编程验证。这说明,猜想是管用的。
猛戳这里全面系统地学习MyBatis 3
MyBatis技术交流群:188972810,或扫描二维码:
【MyBatis学习笔记】系列之预备篇一:ant的下载与安装
【MyBatis学习笔记】系列之预备篇二:ant入门示例
【MyBatis学习笔记】系列之一:MyBatis入门示例
【MyBatis学习笔记】系列之二:MyBatis增删改示例
【MyBatis学习笔记】系列之三:MyBatis的association示例
【MyBatis学习笔记】系列之四:MyBatis association的两种形式
【MyBatis学习笔记】系列之五:MyBatis与Spring集成示例
【MyBatis学习笔记】系列之六:MyBatis与Spring集成示例续
【MyBatis学习笔记】系列之七:MyBatis一对多双向关联
【MyBatis学习笔记】系列之八:MyBatis MapperScannerConfigurer配置
【MyBatis学习笔记】系列之九:MyBatis collection的两种形式
【MyBatis学习笔记】系列之十:MyBatis日志之Log4j示例
【MyBatis学习笔记】系列之十一:MyBatis多参数传递之注解方式示例
【MyBatis学习笔记】系列之十二:MyBatis多参数传递之默认命名方式示例
【MyBatis学习笔记】系列之十三:MyBatis多参数传递之Map方式示例
【MyBatis学习笔记】系列之十四:MyBatis中的N+1问题
【MyBatis学习笔记】系列之十五:MyBatis多参数传递之混合方式
【MyBatis学习笔记】系列之十六:Spring声明式事务管理示例
【MyBatis学习笔记】系列之十七:MyBatis多对多保存示例
【MyBatis学习笔记】系列之十八:MyBatis多对多关联查询示例
【MyBatis学习笔记】系列之十九:如何在MyBatis-3.2.7中使用Log4j2 rc2
MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO(一)
MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO(二)