foreach的说明:
collection:指定要遍历的集合
list类型的参数会特殊处理封装在map中,map的key就叫list
item:将当前遍历出的元素赋值给指定的变量
separator:每个元素之间的分隔符
open:遍历出所有结果拼接一个开始的字符(表示该语句以什么开始)
close:遍历出所有结果拼接一个结束的字符(表示以什么结束)
index:索引。遍历list的时候是index就是索引,item就是当前值
遍历map的时候index表示的就是map的key,item就是map的值。

在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况

  1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
  2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
  3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可

以map为例

<select id="dynamicForeach3Test" parameterType="java.util.HashMap" resultType="Blog">
         select * from t_blog where title like "%"#{title}"%" and id in
          <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
               #{item}
          </foreach>
 </select>

批量插入

list

<insert id ="insertCodeBatch" parameterType="java.util.List" >
            <selectKey resultType ="java.lang.Integer" keyProperty= "id"
                 order= "AFTER">
                SELECT LAST_INSERT_ID()
            </selectKey >
           insert into redeem_code
           (bach_id, code, type, facevalue,create_user,create_time)
           values
            <foreach collection ="list" item="reddemCode" index= "index" separator =",">
                (
                #{reddemCode.batchId}, #{reddemCode.code},
                #{reddemCode.type},
                #{reddemCode.facevalue},
                #{reddemCode.createUser}, #{reddemCode.createTime}
                )
            </foreach >
     </insert >

简单来说,selectKey 会将 SELECT LAST_INSERT_ID()的结果放入到传入的model的主键里面,即获取数据库里自动生成的id

  • keyProperty:对应的model中的主键的属性名,跟数据库的主键对应
  • order:AFTER 表示 SELECT LAST_INSERT_ID() 在insert执行之后执行,多用与自增主键
  • BEFORE 表示 SELECT LAST_INSERT_ID() 在insert执行之前执行,这样的话就拿不到主键了,适合那种主键不是自增的类型
  • resultType:主键类型

大数据list的批量插入

public int insertBySplit(List<ZycxEndState> list ){
        log.info("总共目的站有:" + list.size());
        int count = 0;
        List<ZycxEndState> TempList = new ArrayList<>();
        if(list.size()<1000) {
            int i = taskStateDao.insertEndState(list);
            count += i;
            //执行插入数据
        }else {
            //次数
            int times  = (int) Math.ceil(list.size() / 1000);
            for(int i=0;i<=times ;i++) {
                TempList=list.subList(i*1000, (i+1)*1000);
                //执行插入数据
                int j = taskStateDao.insertEndState(TempList);
                count += j;
            }
        }
        return count;
    }
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐