(十)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","smith@at.com","1",new Department(1)));
            emps.add(new Employee(null,"allen","allen@at.com","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','test_001@at.com')
     insert into employee(employee_id,last_name,email)
    values(employee_seq.nextval,'test_002','test_002@at.com')
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    
    )

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值