MyBatis傳入多個引數

張誌先生發表於2017-02-07

一、單個引數:

public List<XXBean> getXXBeanList(String xxCode); 
<select id="getXXXBeanList" parameterType="java.lang.String" resultType="xxxx.xx.XXBean">  
  select t.* from tableName t where t.xxCode= #{xxCode}     
</select
其中方法名和ID一致,#{}中的引數名與方法中的引數名一致,resultType="xxx.x.XXXBean" , 寫的是類全名

二、多引數:

   第一種方案    DAO層的函式方法

Public User selectUser(String name,String area)

對應的Mapper.xml 

<select id="selectUser" resultMap="BaseResultMap">  
    select  *  from user_user_t   where user_name = #{0} and user_area=#{1}  
</select>
其中,#{0}代表接收的是dao層中的第一個引數,#{1}代表dao層中第二引數,更多引數一致往後加即可。

 第二種方案  此方法採用Map傳多引數

Dao層的函式方法

Public User selectUser(Map paramMap);

對應的Mapper.xml

<select id=" selectUser" resultMap="BaseResultMap">  
   select  *  from user_user_t   where user_name = #{userName,jdbcType=VARCHAR} and user_area=#{userArea,jdbcType=VARCHAR}  
</select>
Service層呼叫

Private User xxxSelectUser(){  
Map paramMap=new hashMap();  
paramMap.put(“userName”,”對應具體的引數值”);  
paramMap.put(“userArea”,”對應具體的引數值”);  
User user=xxx. selectUser(paramMap);}

個人認為此方法不夠直觀,見到介面方法不能直接的知道要傳的引數是什麼。

第三種方案

Dao層的函式方法

Public User selectUser(@param(“userName”)Stringname,@param(“userArea”)String area);

對應的Mapper.xml 

<select id=" selectUser" resultMap="BaseResultMap">  
   select  *  from user_user_t   where user_name = #{userName,jdbcType=VARCHAR} and user_area=#{userArea,jdbcType=VARCHAR}  
</select>   
個人覺得這種方法比較好,能讓開發者看到dao層方法就知道該傳什麼樣的引數,比較直觀,個人推薦用此種方案。

三、List封裝in:

public List<XXXBean> getXXXBeanList(List<String> listTag);

<select id="getXXXBeanList" resultType="XXBean">
  select 欄位... from XXX where id in
  <foreach item="item" index="index" collection="list" open="(" separator="," close=")">  
    #{item}  
  </foreach>  
</select> 
foreach 最後的效果是select 欄位... from XXX where id in ('1','2','3','4'
foreach元素的屬性主要有 item,index,collection,open,separator,close。  item表示集合中每一個元素進行迭代時的別名.
index指 定一個名字,用於表示在迭代過程中,每次迭代到的位置.
open表示該語句以什麼開始,separator表示在每次進行迭代之間以什麼符號作為分隔 符.
close表示以什麼結束. 
四、selectList()只能傳遞一個引數,但實際所需引數既要包含String型別,又要包含List型別時的處理方法:

將引數放入Map,再取出Map中的List遍歷。如下

List<String> list_3 = new ArrayList<String>();
Map<String, Object> map2 = new HashMap<String, Object>();

list.add("1");

list.add("2");

map2.put("list", list); //網址id

map2.put("siteTag", "0");//網址型別
public List<SysWeb> getSysInfo(Map<String, Object> map2) {
  return getSqlSession().selectList("sysweb.getSysInfo", map2);
}

<select id="getSysInfo" parameterType="java.util.Map" resultType="SysWeb">
  select t.sysSiteId, t.siteName, t1.mzNum as siteTagNum, t1.mzName as siteTag, t.url, t.iconPath
   from TD_WEB_SYSSITE t
   left join TD_MZ_MZDY t1 on t1.mzNum = t.siteTag and t1.mzType = 10
   WHERE t.siteTag = #{siteTag } 
   and t.sysSiteId not in 
   <foreach collection="list" item="item" index="index" open="(" close=")" separator=",">
       #{item}
   </foreach>
 </select>






相關文章