MyBatis学习——foreach标签的使用

一、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







  • 13
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Mybatis中的foreach标签是用于循环遍历集合或数组,并将其中的元素作为参数传递给SQL语句中的IN条件。foreach标签可以在SQL语句中动态生成多个IN条件,从而实现批量操作。foreach标签有多种属性可供配置,包括集合或数组的名称、元素的别名、循环计数器等。使用foreach标签可以简化SQL语句的编写,提高代码的可读性和可维护性。 ### 回答2: mybatis是一种Java持久化框架,在处理批量操作时可以使用foreach标签foreach标签可以用于遍历集合或者数组,并将其中的元素进行处理。 使用foreach标签的语法结构如下: ``` <foreach collection="collection" item="item" index="index" open="(" close=")" separator=","> #{item} </foreach> ``` 其中,collection是指定要遍历的集合或者数组,item是集合中的每个元素,index是集合的索引值。open、close和separator是用来指定在遍历时的开头、结尾和分隔符。 在foreach标签中,可以使用#{}来表示要处理的参数,这样可以方便地插入每次遍历的元素值。可以在标签内部编写SQL语句,通过#{}来引用其中的参数。 举个例子,假设有一个User对象集合,我们想要通过遍历该集合,将每个User的id属性插入到数据库中。可以使用以下代码: ``` <insert id="batchInsert" parameterType="java.util.List"> INSERT INTO user (id) VALUES <foreach collection="list" item="item" separator=","> (#{item.id}) </foreach> </insert> ``` 这样在执行SQL语句时,foreach标签会遍历list集合,将每个User对象的id属性插入到数据库中。 总结来说,mybatis中的foreach标签可以用于遍历集合或数组,在SQL语句中动态地插入每次遍历的元素值,实现批量操作的处理。 ### 回答3: MyBatis中的foreach标签是一种用于循环遍历集合或数组的标签。它常用于执行批量操作或动态生成SQL语句。 在MyBatis的映射文件中,我们可以使用foreach标签来遍历一个集合或数组,并在循环中执行相应的SQL语句。foreach标签的语法如下: ``` <foreach collection="collection" item="item" index="index" open="(" separator="," close=")"> #{item} </foreach> ``` 其中,collection属性表示要遍历的集合或数组的表达式。item属性表示在每次循环中的当前元素,index属性表示在每次循环中的索引。open属性表示循环开始时的字符串,separator属性表示每次循环间的分隔符,close属性表示循环结束时的字符串。 在foreach标签中,我们可以通过#{item}来使用每次循环中的元素。例如,如果collection属性为list,那么#{item}将表示list中的每个元素。 使用foreach标签时,我们可以在循环体内执行任意的SQL语句,包括插入、更新、删除等操作。这样,我们就可以在循环中批量执行相同的SQL操作,提高数据操作的效率。 在编写动态SQL时,foreach标签也非常有用。我们可以根据集合或数组的大小决定是否执行某个SQL语句,或者通过拼接SQL语句动态地生成条件。这种动态生成SQL语句的能力使得MyBatis可以更加灵活地应对各种复杂的查询需求。 总之,MyBatis中的foreach标签是一种用于循环遍历集合或数组的标签,它能够帮助我们实现批量操作和动态生成SQL语句,提高数据操作的效率和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值