1 MyBatis動態SQL之if 語句
2 MyBatis動態sql之where標簽|轉
3 MyBatis動態SQL之set標簽|轉
4 MyBatis動態SQL之trim元素|轉
5 MyBatis動態sql中foreach標簽的使用
6 MyBatis動態SQL之choose(when、otherwise)語句
7 MyBatis動態SQL之bind標簽|轉
關於動態SQL另外一個常用的功能就是使用foreach標簽對一個集合進行遍歷,尤其是在構建IN條件語句的時候。
案例1 Spring Boot項目中,Dao層代碼片段如下:
// 查詢指定ID的員工
List<Employee> selectEmployeeIn(Long[] ids);
xml文件代碼片段如下:
<select id="selectEmployeeIn" resultType="cn.mybatis.domain.Employee">
SELECT * FROM tb_employee
<where>
<if test="ids != null">
<foreach item="item" index="index" collection="ids"
open="id in (" separator="," close=")" nullable="true">
#{item}
</foreach>
</if>
</where>
</select>
foreach 元素的功能非常強大,它允許你指定一個集合,聲明可以在元素體內使用的集合項(item)和索引(index)變量。它也允許你指定開頭與結尾的字符串以及集合項迭代之間的分隔符。這個元素也不會錯誤地添加多余的分隔符,看它多智能!
溫馨提示 你可以將任何可迭代對象(如 List、Set 等)、Map 對象或者數組對象作為集合參數傳遞給 foreach。當使用可迭代對象或者數組時,index 是當前迭代的序號,item 的值是本次迭代獲取到的元素。當使用 Map 對象(或者 Map.Entry 對象的集合)時,index 是鍵,item 是值。
假如在上述案例中,請求參數為int[] ids = {1,2,3,4,5},那么,調用selectEmployeeIn后,控制台打印的SQL如下:
SELECT * FROM tb_employee where id in (1,2,3,4,5)
如果把請求參數封裝為map,如下:
public void selectPostIn() {
final List<Long> ids = new ArrayList<Long>();
ids.add(1L);
ids.add(2L);
ids.add(32L);
Map<String,Long> maps = new HashMap();
params.put("ids", ids);
List<Employee> employeeList = employeeMapper.selectEmployeeIn(maps);
}
//---- Dao層修改 ------
List<Employee> selectEmployeeIn(Map<String, Long> mapParam);
則對應的xml仍然可以使用案例1中的selectEmployeeIn。
foreach標簽的主要屬性描述如下:
通常可以將foreach用到批量增刪改查等操作中,關於批量刪除和修改的介紹,請戳《Mybatis 批量操作-刪除、修改和查詢》。
