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片斷。html
<pre name="code" class="html"><!-- 定義sql片斷 id:sql片斷的惟一標識 在sql片斷中不要加入where 經驗:通常咱們定義sql片斷是爲了可重用性,是基於單表來定義sql片斷, 這樣的話這個sql片斷可重用性才高--> <sql id="query_user_where"> <if test="ids!=null"> <!-- 使用foreach遍歷傳入ids collection指定輸入對象中集合屬性 item每次遍歷生成的對象名 open開始遍歷時要拼接的串 close開始遍歷時要拼接的串 separator遍歷的兩個對象中間須要拼接的串 --> <!-- 使用實現下邊的sql拼接 WHERE (id=1 OR id=3 OR id=5)--> <foreach collection="ids" item="user_id" open="AND (" close=")" separator="OR"> <!-- 每次遍歷要拼接的串 --> id=#{user_id} </foreach> </if> </sql> <!-- 用戶信息綜合查詢 --> <select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="cn.edu.hpu.mybatis.PO.UserCustom"> select * from user <!-- where標籤能夠自動去掉第一個and --> <where> <!-- 應用sql片斷的id,若是refid指定的id再也不本mapper文件中,須要前邊加namespace --> <include refid="query_user_where"></include> <!-- 在這裏還可能要引用其餘的sql片斷 --> </where> </select>
在mapper接口類中添加相應方法:java
//用戶管理的Dao接口 public interface UserMapper { //用戶信息綜合查詢 public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception; ...... }
1.4測試代碼sql
//用戶信息綜合查詢 @Test public void testFindUserList() throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); //建立UserMapper代理對象 UserMapper userMapper=sqlSession.getMapper(UserMapper.class); //建立包裝對象,設置查詢條件 UserQueryVo userQueryVo=new UserQueryVo(); //傳入多個Id List<Integer> ids=new ArrayList<Integer>(); ids.add(1); ids.add(3); ids.add(5); //將ids經過userQueryVo傳入statement中 userQueryVo.setIds(ids); //調用userMapper的方法 List<UserCustom> users=userMapper.findUserList(userQueryVo); for (int i = 0; i < users.size(); i++) { UserCustom user=(UserCustom)users.get(i); System.out.println(user.getId()+":"+user.getUsername()); } }
測試結果:
1:張三
3:劉莉莉
5:劉三姐數組
能夠看到,sql語句select * from user WHERE ( id=? OR id=? OR id=? ) 經過foreach輸出成功
1.5另一個sql的實現:mybatis
<!-- 使用實現下邊的sql拼接 AND ID IN(1,3,5)--> <foreach collection="ids" item="user_id" open="AND ID IN(" close=")" separator=","> <!-- 每次遍歷要拼接的串 --> #{user_id} </foreach>