第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

MyBatis foreach

1. 前言

在 MyBatis 中,常常會遇到集合類型的參數(shù),雖然我們可以通過 OGNL 表達式來訪問集合的某一個元素,但是 OGNL 表達式無法遍歷集合。foreach 標(biāo)簽就是專門用來解決這類問題的,本小節(jié)我們就來一起學(xué)習(xí)它。

2. 定義

慕課解釋:foreach 標(biāo)簽用來遍歷數(shù)組、列表和 Map 等集合參數(shù),常與 in 關(guān)鍵字搭配使用。

3. 實例

我們以 3 個例子來看一看 foreach 是如何遍歷列表、數(shù)組和 Map 的。

3.1 遍歷列表

xml:

<select id="selectUserInIds" resultType="com.imooc.mybatis.model.User">
  SELECT * FROM imooc_user
  WHERE id IN
  <foreach collection="list" open="(" close=")" separator="," item="item" index="index">
    #{item}
  </foreach>
</select>

Java:

List<User> selectUserInIds(List<Integer> ids);

上面是 selectUserInIds 方法在 java 和 xml 中對應(yīng)的代碼段。

foreach 標(biāo)簽共有 6 個屬性,它們的作用分別為:

  • collection: 被遍歷集合參數(shù)的名稱,如 list;
  • open: 遍歷開始時插入到 SQL 中的字符串,如 ( ;
  • close: 遍歷結(jié)束時插入到 SQL 中的字符串,如 ) ;
  • separator: 分割符,在每個元素的后面都會插入分割符;
  • item: 元素值,遍歷集合時元素的值;
  • index: 元素序列,遍歷集合時元素的序列。

當(dāng) selectUserInIds 方法的參數(shù) ids 為Arrays.asList(1, 2)時,生成的 SQL 語句為:

SELECT * FROM imooc_user WHERE id IN ( 1 , 2 ) 

foreach 標(biāo)簽的 collection 屬性在接受參數(shù)名有兩種情況:一、匿名參數(shù),當(dāng)在 java 方法中沒有通過 @Param 注解指定參數(shù)名時,列表類型的使用默認(rèn)參數(shù)名 list。二、具名參數(shù),java 方法中使用了@Param 注解指定了參數(shù)名稱,則 foreach 中的 collection 屬性必須為參數(shù)名,如:

List<User> selectUserInIds(@Param("ids") List<Integer> ids);
<foreach collection="ids" open="(" close=")" separator="," item="item" index="index">
  #{item}
</foreach>

我們推薦你為列表類型參數(shù)用注解指定一個名稱,讓使用該名稱來遍歷,方便代碼維護和閱讀。

3.2 遍歷數(shù)組

當(dāng) Java 方法使用的參數(shù)類型為數(shù)組時,如下:

List<User> selectUserInIds(Integer[] ids);

如果 ids 參數(shù)使用 @Param 注解指定了參數(shù)名稱,則 foreach 標(biāo)簽中的 collection 屬性必須為該名稱;但若未指定名稱,則在 foreach 標(biāo)簽中使用默認(rèn)數(shù)組名稱 array,如下:

<select id="selectUserInIds" resultType="com.imooc.mybatis.model.User">
  SELECT * FROM imooc_user
  WHERE id IN
  <foreach collection="array" open="(" close=")" separator="," item="item" index="index">
    #{item}
  </foreach>
</select>

3.3 遍歷 Map

當(dāng) Java 方法使用的參數(shù)類型為 Map 時,如下:

int updateUserById(@Param("params") Map map, @Param("id") Integer id);

使用 foreach 標(biāo)簽遍歷 Map 時,collection 屬性值為注解指定的參數(shù)名,即 params,且 item 是 Map 的鍵值,index 是鍵名。

<update id="updateUserById">
  UPDATE imooc_user
  SET
  <foreach collection="params" item="val" index="key" separator=",">
    ${key} = #{val}
  </foreach>
  WHERE id = #{id}
</update>

注意: 由于 key 是字段名稱,因此不能使用#{}作為占位符,只能使用${}在字符串中替換。

updateUserById 生成的 SQL 語句大致如下:

UPDATE imooc_user SET score = ? , age = ? WHERE id = ? 

4. 實踐

4.1 例1. 使用名稱批量查詢用戶

請使用 MyBatis 完成對 imooc_user 表使用名稱批量查詢用戶的功能,參數(shù)為一個名稱列表,使用 in 關(guān)鍵字進行查詢。

分析:

按照 MyBatis 的開發(fā)模式,先在 UserMapper.xml 文件中添加使用名稱批量查詢用戶的 select 標(biāo)簽,然后在 UserMapper.java 中添加上對應(yīng)的方法。

步驟:

首先,在 UserMapper.xml 中添加 select 標(biāo)簽,并在標(biāo)簽中寫入 SQL,使用 foreach 標(biāo)簽來遍歷名稱列表。

<select id="selectUserInNames" resultType="com.imooc.mybatis.model.User">
  SELECT * FROM imooc_user
  WHERE username IN
  <foreach collection="names" open="(" close=")" separator="," item="item" index="index">
    #{item}
  </foreach>
</select>

然后在 UserMapper.java 中添加上對應(yīng)的接口方法:

package com.imooc.mybatis.mapper;

import org.apache.ibatis.annotations.Mapper;
import com.imooc.mybatis.model.User;

@Mapper
public interface UserMapper {
   List<User> selectUserInNames(@Param("names") List<String> names);
}

結(jié)果:

通過如下代碼,我們運行 selectUserInNames 這個方法。

UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> users = userMapper.selectUserInNames(Arrays.asList("pedro", "peter"));
System.out.println(users);

成功后,結(jié)果為:

[User{id=1, username='peter', age=18, score=100}, User{id=2, username='pedro', age=24, score=200}]

4.2 例2. 批量插入用戶

請使用 MyBatis 完成對 imooc_user 表批量插入用戶的功能,參數(shù)為一個用戶列表。

分析:

同上。

步驟:

首先,在 UserMapper.xml 中添加 insert 標(biāo)簽,并在標(biāo)簽中寫入 SQL,使用 foreach 標(biāo)簽來遍歷用戶列表。

<insert id="insertUsers">
  INSERT INTO imooc_user(username,age,score)
  VALUES
  <foreach collection="users" item="user" separator=",">
    (#{user.username}, #{user.age}, #{user.score})
  </foreach>
</insert>

注意,這里遍歷 users 得到的單位是 user,user 是一個對象,因此必須通過 OGNL 表達式來取 user 的屬性。

然后在 UserMapper.java 中添加上對應(yīng)的接口方法:

package com.imooc.mybatis.mapper;

import org.apache.ibatis.annotations.Mapper;
import com.imooc.mybatis.model.User;

@Mapper
public interface UserMapper {
   int insertUsers(@Param("users") List<User> users);
}

結(jié)果:

通過如下代碼,我們運行 insertUsers 這個方法。

User user1 = new User();
user1.setUsername("user1");
user1.setScore(100);
user1.setAge(0);
User user2 = new User();
user2.setUsername("user2");
user2.setScore(210);
user2.setAge(20);
int rows = userMapper.insertUsers(Arrays.asList(user1, user2));
System.out.println(rows);

成功后,結(jié)果為:

2

5. 小結(jié)

  • foreach 標(biāo)簽是使用非常廣泛的一個標(biāo)簽,當(dāng)使用 SQL 進行批量插入、查詢時都需要使用到它。
  • 列表遍歷的使用最為廣泛,數(shù)組和 Map 則相對較少。