MyBatis關於Mapper設定檔知識集合

來源:互聯網
上載者:User

標籤:mybatis   xml   

(1)MyBatis多參數傳遞之預設命名方式

      對於映射器中的方法,MyBatis預設從左至右給方法的參數命名為param1、param2…,依次類推。我們可以無需藉助註解,直接在SQL語句中使用這些預設名稱。

      首先去掉@Param註解的TeacherMapper.java如下所示(完整源碼:http://down.51cto.com/data/539217):

123456789101112131415161718 package com.abc.mapper;import com.abc.domain.Teacher;import org.springframework.stereotype.Component;import java.util.List;//@Component指定映射器名稱為myTeacherMapper//相關內容,可參考筆者部落格://http://legend2011.blog.51cto.com/3018495/980150@Component("myTeacherMapper")public interface TeacherMapper {public Teacher getById(int id);//分頁查詢教師資訊public List<Teacher> findTeacherByPage(String sort,//排序欄位String dir,  //排序方向int start, //起始記錄int limit  //記錄條數);}

       按照上述的預設命名方式,MyBatis對findTeacherByPage方法的參數從左至右的預設命名依次是:sort為param1,dir為param2,start為param3,limit為param4。然後,就可以在對應檔TeacherMapper.xml裡的、與此方法相對應的SQL語句中以#{參數名}的方式來使用這些名稱了。如下第25行所示:

123456789101112131415161718192021222324252627 <?xml version="1.0" encoding="utf8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--與以前一樣,namespace的值是對應的映射器介面的完整名稱--><mapper namespace="com.abc.mapper.TeacherMapper"><!--教師實體映射--><resultMap id="supervisorResultMap" type="Teacher"><id property="id"/><result property="name"/><result property="gender"/><result property="researchArea"column="research_area"/><result property="title"/><!--collection元素映射教師的指導學生集合的屬性。這裡採用了“命名空間名.select語句id”的形式來引用StudentMapper.xml中的select語句getStudents。關於這種collection元素使用嵌套的select語句的詳情,請參考筆者部落格:http://legend2011.blog.51cto.com/3018495/985907--><collection property="supStudents" column="id" ofType="Student"select="com.abc.mapper.StudentMapper.getStudents"/></resultMap><!--param1、param2等是MyBatis對映射器方法參數的預設命名--><select id="findTeacherByPage" resultMap="supervisorResultMap">select * from teacherorder by ${param1} ${param2} limit #{param3},#{param4}</select></mapper>

      和利用註解的方式一樣,在order by子句中使用#{參數名}的方式無效,讀者可自行實驗。所以,這裡仍然使用${參數名}的方式。


(2)MyBatis多參數傳遞之Map方式

前面的文章介紹了MyBatis多參數傳遞的註解、參數預設命名等方式,今天介紹Map的方式。仍然以前面的分頁查詢教師資訊的方法findTeacherByPage為例(樣本原始碼:http://down.51cto.com/data/546809)。

      首先修改映射器介面TeacherMapper中的findTeacherByPage方法如下:

12 //分頁查詢教師資訊public List<Teacher> findTeacherByPage(Map<String, Object> map);

      相應地,這裡用到了Map介面,就應該引入此介面:import java.util.Map。

在執行類CollectionDemo中,調用findTeacherByPage方法的相關代碼如下:

1234567891011 Map<String, Object> params = new HashMap<String, Object>();//以name欄位升序排序,params.put("sort""name");params.put("dir""asc");//查詢結果從第0條開始,查詢2條記錄params.put("start"0);params.put("limit"2);//查詢職稱為教授或副教授的教師params.put("title""%教授");//分頁查詢教師資訊List<Teacher> teachers = mapper.findTeacherByPage(params);

      可以看出,我們先把參數放在了一個Map中,這樣我們就可以在相應的SQL語句中以#{…}的形式引用這些參數了。如下所示:

12345 <select id="findTeacherByPage" resultMap="supervisorResultMap"parameterType="java.util.Map">select * from teacher where title like #{title}order by ${sort} ${dir} limit #{start},#{limit}</select>

       與以前一樣,在order by子句中應使用${…}的方式。實際上,這裡的parameterType="java.util.Map"可以不要。

(3)MyBatis多參數傳遞之混合方式

網友mashiguang提問如下的方法如何傳遞參數:public List findStudents(Map conditions, int page, int pageSize)。這是一種混合形式,亦即既有Map類型的參數,也有類似int這種普通類型的參數。經過一番摸索,筆者還比較順利地找到了這種情況的處理方法。

      其實也很簡單。在預設命名方式(MyBatis多參數傳遞之預設命名方式樣本)一文中,介紹了MyBatis對參數的預設命名,這種命名在這種情況下依然有效。我們需要做的,就是如何根據這個命名讀出Map中的參數值。這裡就採用這種方式來實現教師分頁查詢。先修改映射器介面(TeacherMapper.java)中的教師分頁查詢方法的聲明如下(完整源碼下載:http://down.51cto.com/data/742758): 

123456 //分頁查詢教師資訊public List<Teacher> findTeacherByPage(Map params, //查詢條件int start, //起始記錄int limit  //記錄條數);

 (代碼1)

      那麼MyBatis將會對此方法的三個參數依次命名為param1、param2和param3,其中第一個參數為Map類型,後兩個參數為int類型。

      執行類(CollectionDemo.java)中的查詢程式碼片段如下: 

123456789101112 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,02);

  (代碼2)

      相應的映射配置(TeacherMapper.xml)檔案片段如下: 

1234 <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關於Mapper設定檔知識集合

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.