foreach的说明:
collection:指定要遍历的集合
list类型的参数会特殊处理封装在map中,map的key就叫list
item:将当前遍历出的元素赋值给指定的变量
separator:每个元素之间的分隔符
open:遍历出所有结果拼接一个开始的字符(表示该语句以什么开始)
close:遍历出所有结果拼接一个结束的字符(表示以什么结束)
index:索引。遍历list的时候是index就是索引,item就是当前值
遍历map的时候index表示的就是map的key,item就是map的值。
在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况
- 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
- 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
- 如果传入的参数是多个的时候,我们就需要把它们封装成一个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;
}