MyBatis多参数传递之混合方式

   在本系列文章的《 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 ):  java

  1. //分页查询教师信息  
  2. public  List<Teacher> findTeacherByPage(  
  3.          Map params,  //查询条件  
  4.      int  start,  //起始记录  
  5.      int  limit   //记录条数  
  6.     ); 

 (代码1) 编程

      那么MyBatis将会对此方法的三个参数依次命名为param一、param2和param3,其中第一个参数为Map类型,后两个参数为int类型。 app

      执行类(CollectionDemo.java)中的查询代码片断以下:  学习

  1. Map<String, Object> params =  
  2.      new  HashMap<String, Object>();  
  3.  
  4. //以name字段升序排序,  
  5. params.put( "sort" "name" );  
  6. params.put( "dir" "asc" );  
  7. //查询职称为教授或副教授的教师  
  8. params.put( "title" "%教授" );  
  9.  
  10. //查询教师分页信息  
  11. List<Teacher> teachers =  
  12. //以name字段升序排序,从第0条记录开始查询。  
  13. //查询2条记录  
  14.            mapper.findTeacherByPage(params, 0 2 );  

 (代码2) spa

      相应的映射配置(TeacherMapper.xml)文件片断以下:  xml

  1. < select   id = "findTeacherByPage"   resultMap = "supervisorResultMap" >  
  2. select * from teacher where teacher.title like  
  3. #{param1.title} order by ${param1.sort} ${param1.dir} limit #{param2},#{param3}  
  4. </ select >  

 (代码3) blog

      在以上的映射文件中,使用#{param1.title}的形式就能访问Map中title属性的值。固然,在order by子句中应使用${param1.sort}的形式(可参见本系列博文中的“ MyBatis多参数传递之注解方式示例 ”一文,第二部分“可能会遇到的错误”第一个就是关于order by的。不过经笔者验证,在本例中使用“#”也是能够的)。由此咱们能够总结出,咱们使用#{参数默认命名.属性名}的形式,就能够在映射文件访问Map参数的属性值。 排序

      运行结果以下: 

       显然,若是使用注解的方式,给参数指定名称(关于注解方式传递多个参数,请参考本系列的博文: MyBatis多参数传递之注解方式示例 ),亦可以使用上述形式来访问Map中的属性值,在此再也不赘述(采用注解时,访问Map中的属性的源码,请到此处下载: http://down.51cto.com/data/742780 )。 接口

      总结:在《 关于该不应上JAVA培训班的一点见解 》一文中,笔者提出的学习方法之一是“善于猜测”。而本次问题的解决,笔者并无找到相关的参考资料,只是凭借着本身的猜测和编程验证。这说明,猜测是管用的。
相关文章
相关标签/搜索