1. 程式人生 > >【MyBatis框架】mapper配置檔案-foreach標籤

【MyBatis框架】mapper配置檔案-foreach標籤

foreach標籤

下面介紹一下一個mapper配置檔案中的foreach標籤(注意,要跟著前面的總結來看,這裡使用的例子是結合前面的工程寫的,大部分程式碼沒有再贅述)

foreach的作用是向sql傳遞陣列或List,mybatis使用foreach解析

1.1需求
在使用者查詢列表和查詢總數的statement中增加多個id輸入查詢。
sql語句如下:

兩種方法:
SELECT * FROM USER WHERE id=1 OR id=3 OR id=5

SELECT * FROM USER WHERE id IN(1,3,5)

1.2在輸入引數型別中新增List<Integer> ids傳入多個id

public class UserQueryVo {

//傳入多個id
private List<Integer> ids;

public List<Integer> getIds() {
return ids;
}

public void setIds(List<Integer> ids) {
this.ids = ids;
}
......
}

1.3修改mapper.xml

WHERE id=1 OR id=3 OR id=5
在查詢條件中,查詢條件定義成一個sql片段,需要修改sql片段。
  1. <prename="code"class="html"><!-- 定義sql片段   
  2. id:sql片段的唯一標識   
  3. 在sql片段中不要加入where  
  4. 經驗:一般我們定義sql片段是為了可重用性,是基於單表來定義sql片段,  
  5. 這樣的話這個sql片段可重用性才高-->
  6. <sqlid="query_user_where">
  7.     <iftest="ids!=null">
  8.         <!-- 使用foreach遍歷傳入ids   
  9.         collection指定輸入物件中集合屬性  
  10.         item每次遍歷生成的物件名  
  11.         open開始遍歷時要拼接的串  
  12.         close開始遍歷時要拼接的串  
  13.         separator遍歷的兩個物件中間需要拼接的串  
  14.         -->
  15.         <!-- 使用實現下邊的sql拼接   
  16.         WHERE (id=1 OR id=3 OR id=5)-->
  17.         <foreachcollection="ids"item="user_id"open="AND ("close=")"separator="OR">
  18.             <!-- 每次遍歷要拼接的串 -->
  19.             id=#{user_id}  
  20.         </foreach>
  21.     </if>
  22. </sql>
  23. <!-- 使用者資訊綜合查詢 -->
  24.     <selectid="findUserList"parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo"
  25.                                 resultType="cn.edu.hpu.mybatis.PO.UserCustom">
  26.         select * from user   
  27.         <!-- where標籤可以自動去掉第一個and -->
  28.         <where>
  29.             <!-- 應用sql片段的id,如果refid指定的id不再本mapper檔案中,需要前邊加namespace -->
  30.             <includerefid="query_user_where"></include>
  31.             <!-- 在這裡還可能要引用其他的sql片段 -->
  32.         </where>
  33.     </select>
在mapper介面類中新增相應方法:
  1. //使用者管理的Dao介面
  2. publicinterface UserMapper {  
  3.     //使用者資訊綜合查詢
  4.     public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;  
  5.     ......  
  6. }  

1.4測試程式碼
  1. //使用者資訊綜合查詢
  2.     @Test
  3.     publicvoid testFindUserList() throws Exception{  
  4.         SqlSession sqlSession=sqlSessionFactory.openSession();  
  5.         //建立UserMapper代理物件
  6.         UserMapper userMapper=sqlSession.getMapper(UserMapper.class);  
  7.         //建立包裝物件,設定查詢條件
  8.         UserQueryVo userQueryVo=new UserQueryVo();  
  9.         //傳入多個Id
  10.         List<Integer> ids=new ArrayList<Integer>();  
  11.         ids.add(1);  
  12.         ids.add(3);  
  13.         ids.add(5);  
  14.         //將ids通過userQueryVo傳入statement中
  15.         userQueryVo.setIds(ids);  
  16.         //呼叫userMapper的方法
  17.         List<UserCustom> users=userMapper.findUserList(userQueryVo);  
  18.         for (int i = 0; i < users.size(); i++) {  
  19.             UserCustom user=(UserCustom)users.get(i);  
  20.             System.out.println(user.getId()+":"+user.getUsername());  
  21.         }  
  22.     }  

測試結果:
1:張三
3:劉莉莉
5:劉三姐


日誌輸出:
  1. DEBUG [main] - Opening JDBC Connection  
  2. DEBUG [main] - Created connection 6867819.  
  3. DEBUG [main] - Setting autocommit to false on JDBC Connection [[email protected]]  
  4. DEBUG [main] - ==>  Preparing: select * from user WHERE ( id=? OR id=? OR id=? )   
  5. DEBUG [main] - ==> Parameters: 1(Integer), 3(Integer), 5(Integer)  
  6. DEBUG [main] - <==      Total: 3  

可以看到,sql語句select * from user WHERE ( id=? OR id=? OR id=? ) 通過foreach輸出成功


1.5另外一個sql的實現:
  1. <!-- 使用實現下邊的sql拼接   
  2. AND ID IN(1,3,5)-->
  3. <foreachcollection="ids"item="user_id"open="AND ID IN("close=")"separator=",">
  4.     <!-- 每次遍歷要拼接的串 -->
  5.     #{user_id}  
  6. </foreach>