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培訓班的一點見解 》一文中,筆者提出的學習方法之一是「善於猜測」。而本次問題的解決,筆者並無找到相關的參考資料,只是憑藉着本身的猜測和編程驗證。這說明,猜測是管用的。
相關文章
相關標籤/搜索