(十)Mybatis的入门教程—— 动态sql之 foreach标签

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    
    )

猜你喜欢

转载自blog.csdn.net/Steriles_/article/details/81738521
今日推荐