動態sql是mybatis的核心,主要是對sql語句進行靈活操作,通過表達式進行判斷,對sql進行靈活的拼接、組裝。
用戶信息綜合查詢列表和用戶信息查詢列表總數這兩個statement的定義使用動態sql。對查詢條件進行判斷,如果輸入參數不為空才進行查詢條件拼接。
將上邊實現的動態sql判斷代碼塊抽取出來,組成一個sql片段。其它的statement中就可以引用sql片段。方便程序員進行開發。
其中的關鍵是這一句引用:
<!-- 引用sql片段 的id,如果refid指定的id不在本mapper文件中,需要前邊加namespace --><include refid="query_user_where"></include>
向sql傳遞數組或List,mybatis使用foreach解析
在用戶查詢列表和查詢總數的statement中增加多個id輸入查詢。 類似下面的sql語句:
SELECT * FROM USER WHERE id=1 OR id=10 OR id=16SELECT * FROM USER WHERE id IN(1,10,16)WHERE id=1 OR id=10 OR id=16,在查詢條件中,查詢條件定義成一個sql片段,需要修改sql片段。
<if test="ids!=null"> <!-- 使用 foreach遍歷傳入ids collection:指定輸入 對象中集合屬性 item:每個遍歷生成對象中 open:開始遍歷時拼接的串 close:結束遍歷時拼接的串 separator:遍歷的兩個對象中需要拼接的串 --> <!-- 使用實現下邊的sql拼接: AND (id=1 OR id=10 OR id=16) --> <foreach collection="ids" item="user_id" open="AND (" close=")" separator="or"> <!-- 每個遍歷需要拼接的串 --> id=#{user_id} </foreach>修改上面的測試方法,傳入多個id進行測試。
//創建包裝對象,設置查詢條件 UserQueryVo userQueryVo = new UserQueryVo(); UserCustom userCustom = new UserCustom(); //由于這里使用動態sql,如果不設置某個值,條件不會拼接在sql中 //userCustom.setSex("1"); userCustom.setUsername("小明"); //傳入多個id List<Integer> ids = new ArrayList<Integer>(); ids.add(1); ids.add(10); ids.add(16); //將ids通過userQueryVo傳入statement中 userQueryVo.setIds(ids); userQueryVo.setUserCustom(userCustom); //調用userMapper的方法 List<UserCustom> list = userMapper.findUserList(userQueryVo); System.out.println(list);新聞熱點
疑難解答