在本系列文章的《
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
- //分頁查詢教師信息
- public List<Teacher> findTeacherByPage(
- Map params, //查詢條件
- int start, //起始記錄
- int limit //記錄條數
- );
(代碼1) 編程
那麼MyBatis將會對此方法的三個參數依次命名爲param一、param2和param3,其中第一個參數爲Map類型,後兩個參數爲int類型。 app
執行類(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) spa
相應的映射配置(TeacherMapper.xml)文件片斷以下: 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) blog
在以上的映射文件中,使用#{param1.title}的形式就能訪問Map中title屬性的值。固然,在order by子句中應使用${param1.sort}的形式(可參見本系列博文中的「 MyBatis多參數傳遞之註解方式示例 」一文,第二部分「可能會遇到的錯誤」第一個就是關於order by的。不過經筆者驗證,在本例中使用「#」也是能夠的)。由此咱們能夠總結出,咱們使用#{參數默認命名.屬性名}的形式,就能夠在映射文件訪問Map參數的屬性值。 排序
運行結果以下:
顯然,若是使用註解的方式,給參數指定名稱(關於註解方式傳遞多個參數,請參考本系列的博文: MyBatis多參數傳遞之註解方式示例 ),亦可以使用上述形式來訪問Map中的屬性值,在此再也不贅述(採用註解時,訪問Map中的屬性的源碼,請到此處下載: http://down.51cto.com/data/742780 )。 接口
總結:在《
關於該不應上JAVA培訓班的一點見解 》一文中,筆者提出的學習方法之一是「善於猜測」。而本次問題的解決,筆者並無找到相關的參考資料,只是憑藉着本身的猜測和編程驗證。這說明,猜測是管用的。