MyBatis學習——foreach標籤的使用

t1heluosh1發表於2018-01-14

一、foreach標籤屬性解讀

MyBatis的foreach標籤應用於多引數的互動如:多引數(相同引數)查詢、迴圈插入資料等,foreach標籤包含collection、item、open、close、index、separator,MyBatis的foreach標籤與jstl標籤的使用非常相似,以下為幾個屬性的意思解釋:

collection:引數名稱,根據Mapper介面的引數名確定,也可以使用@Param註解指定引數名

item:引數呼叫名稱,通過此屬性來獲取集合單項的值

open:相當於prefix,即在迴圈前新增字首

close:相當於suffix,即在迴圈後新增字尾

index:索引、下標

separator:分隔符,每次迴圈完成後新增此分隔符

二、foreach標籤應用

1.多引數查詢

場景描述:傳入多個使用者ID,獲取使用者的結果集

Junit業務方法呼叫

/**
	 * 動態sql學習---foreach標籤使用(查詢)
	 * @throws IOException 
	 * 
	 */
	@Test
	public void dynamicSQLToForeach() throws IOException {
		SqlSessionFactory sessionFactory = getSessionFactory();
		SqlSession sqlSession = sessionFactory.openSession();
		try {
			UserMapper mapper = sqlSession.getMapper(UserMapper.class);
			List<User> users = mapper.getUsersByListParam(Arrays.asList(1,2,3,4));
			for(User user:users) {
				System.out.println(user);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			sqlSession.close();
		}
	}

mapper介面(指定引數名稱)

/**
	 * 多個引數查詢user集合
	 * 
	 * @param list
	 * @return
	 */
	@SuppressWarnings("unchecked")
	List<User> getUsersByListParam(@Param("list") List list);
XML實現:

<!-- 使用foreach接收list引數 -->
    	<select id="getUsersByListParam" resultType="com.xuyong.entity.User">
    		select * from user
    		<foreach collection="list" item="item" open="where user_id in(" close=")" separator=",">
    			#{item}
    		</foreach>
    	</select>
SQL列印:

[com.xuyong.dao.UserMapper.getUsersByListParam]-==>  Preparing: select * from user where user_id in( ? , ? , ? , ? ) 
  [com.xuyong.dao.UserMapper.getUsersByListParam]-==> Parameters: 1(Integer), 2(Integer), 3(Integer), 4(Integer)
  [com.xuyong.dao.UserMapper.getUsersByListParam]-<==    Columns: user_id, user_name, gender, email, address, dept_id
  [com.xuyong.dao.UserMapper.getUsersByListParam]-<==        Row: 1, t1heluosh1, 0, t1heluosh1@163.com, 安徽省合肥市, 1
  [com.xuyong.dao.UserMapper.getUsersByListParam]-<==        Row: 2, 王亞飛, 0, wangyafei@163.com, 安徽省合肥市, 1
  [com.xuyong.dao.UserMapper.getUsersByListParam]-<==        Row: 3, 張傑, 1, zhangjie@163.com, 安徽省黃山市, 3
  [com.xuyong.dao.UserMapper.getUsersByListParam]-<==        Row: 4, Lucy, 1, lucy@126.com, 美利堅合眾國舊金山, 2
  [com.xuyong.dao.UserMapper.getUsersByListParam]-<==      Total: 4
2.迴圈插入資料

Junit業務方法呼叫

/**
	 * 動態sql學習---foreach標籤使用(新增)
	 * @throws IOException 
	 * 
	 */
	@Test
	public void insertMultiUsers() throws IOException {
		SqlSessionFactory sessionFactory = getSessionFactory();
		SqlSession sqlSession = sessionFactory.openSession();
		try {
			UserMapper mapper = sqlSession.getMapper(UserMapper.class);
			List<User> users = new ArrayList<User>();
			users.add(new User("HanMeimei",1,"HanMeimei@163.com","江蘇省南京市",2));
			users.add(new User("李雷",0,"LiLei@163.com","北京市",1));
			users.add(new User("QQ小冰",1,"xiaobing@163.com","深圳市",2));
			int count = mapper.insertMultiUsers(users);
			sqlSession.commit();
			System.out.println(count);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			sqlSession.close();
		}
	}
Mapper介面

/**
	 * 使用foreach批量插入
	 * 
	 * @param users
	 * @return
	 */
	int insertMultiUsers(@Param("users") List<User> users);
XML實現

<!-- 使用foreach批量插入使用者-->
    	<insert id="insertMultiUsers">
    		insert into user(user_name,gender,email,address,dept_id)
    		values
    		<foreach collection="users" item="user" separator=",">
    			(#{user.userName},#{user.gender},#{user.email},#{user.address},#{user.deptId})
    		</foreach>
    	</insert>
SQL列印

[com.xuyong.dao.UserMapper.insertMultiUsers]-==>  Preparing: insert into user(user_name,gender,email,address,dept_id) values (?,?,?,?,?) , (?,?,?,?,?) , (?,?,?,?,?) 
  [com.xuyong.dao.UserMapper.insertMultiUsers]-==> Parameters: HanMeimei(String), 1(Integer), HanMeimei@163.com(String), 江蘇省南京市(String), 2(Integer), 李雷(String), 0(Integer), LiLei@163.com(String), 北京市(String), 1(Integer), QQ小冰(String), 1(Integer), xiaobing@163.com(String), 深圳市(String), 2(Integer)
  [com.xuyong.dao.UserMapper.insertMultiUsers]-<==    Updates: 3
  3







相關文章