foreach遍历集合
foreach标签:
collection属性:指定要遍历的集合;其中list类型的参数会特殊处理封装在map中,map的key就叫list
item属性:将当前遍历出的元素赋值给指定的变量,然后利用 #{ 变量名 }:就能取出变量的值 即当前遍历出的元素
separator属性:每个元素之间的分隔符
open属性:遍历出所有结果拼接一个开始的字符
close属性:遍历出所有结果拼接一个结束的字符
index属性:表示索引。
遍历list的时候index就表示索引,item属性就表示当前值;
遍历map的时候index就表示为map的key,而这里,item属性表示的就是map的值。
<select id="getEmpsByConditionForeach" resultType="com.mybatis.bean.Employee">
select * from tbl_employee where id in
<foreach collection="ids" item="item_id" separator=","
open="(" close=")" index="i">
#{item_id}
</foreach>
</select>
测试
@Test
public void test(){
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try{
EmployeeMapperDynamicSQL mapper =
openSession.getMapper(EmployeeMapperDynamicSQL.class);
Employee employee = new Employee(1, "Admin", null, null);
List<Empolyee> list =
mapper.getEmpsByConditionForeach(Arrays,asList(1,2,3,4));
for (Employee emp : list){
System.out.println(emp);
}
}finally{
openSession.close();
}
}
结果
foreach批量保存
数据库中批量插入的演示
接口
public interface EmployeeMapperDynamicSQL{
public void addEmps(@Param("emps")list<Employee> emps);
}
映射文件
<insert id="addEmps">
insert into tbl_employee(last_name,email,gender,d_id)
values
<foreach collection="emps" item="emp" separator=",">
(#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id})
</foreach>
</insert>
测试
@Test
public void testBatchSave() throws IOException{
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession openSession = sqlSessionFactory.openSession();
try{
EmployeeMapperDynamicSQL mapper =
openSession.getMapper(EmployeeMapperDynamicSQL.class);
List<Empolyee> emps = new ArrayList<>();
emps.add(new Employee(null,"smith","[email protected]","1",new Department(1)));
emps.add(new Employee(null,"allen","[email protected]","1",new Department(0)));
mapper.addEmps(emps);
openSession.commit();
}finally{
openSession.close();
}
}
结果
MySQL下批量保存的方法:
1、把要插入的values( )模板放在foreach标签中遍历,mysql支持values( ),( ),( )语法 (推荐用这种方式)
2、把整个保存数据的sql语句放入foreach标签中,但需要数据库连接属性 allowMultiQueries=true 的支持
第二种方法示范
映射文件
<insert id="addEmps">
<foreach collection="emps" item="emp" separator=";">
insert into tbl_employee(last_name,email,gender,d_id)
values (#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id})
</foreach>
</insert>
但是要添加一条连接属性
结果数据保存正常
Oracle数据库批量保存:
首先,Oracle不支持values(),(),();
1、Oracle支持多个insert放在begin - end里面
begin
insert into employee(employee_id,last_name,email)
values(employee_seq.nextval,'test_001','[email protected]')
insert into employee(employee_id,last_name,email)
values(employee_seq.nextval,'test_002','[email protected]')
end;
2、Oracle利用中间表进行批量插入
insert into employees(employee_id,last_name,email)
select employees_swq.nextval,lastName,email
from(
select 'test_a_01' lastName,'test_a_e01' email from dual
union
select 'test_a_02' lastName,'test_a_e02' email from dual
union
select 'test_a_03' lastName,'test_a_e03' email from dual
)