zoukankan      html  css  js  c++  java
  • MyBatis(五)动态SQL 之 批量操作(插入)

    一、批量插入

      在MySQL 下面实现批量添加在 values 后面添加多个数据,用逗号分隔

    insert into emp values(),(),(),()
    

      但是 MySQL 与 Oracle 插入方式不一致,下面具体分析。

    二、MySQL 实现批量插入

      1、方式一

        MySQL 支持 values(), (), () 的语法。

        在接口中声明方法:

    public void addEmps(@Param("emps")List<Employee> emps);

        在对应的 xml 中配置:

        <!--
            方式一:MySQL下批量保存,可以foreach遍历,mysql支持values(),(),() 语法
            推荐使用
        -->
        <insert id="addEmps" databaseId="mysql">
            insert into tbl_employee(last_name, email, gender, dept_id)
            values
            <foreach collection="emps" item="emp" separator=",">
                (#{emp.lastName}, #{emp.email}, #{emp.gender}, #{emp.department.id})
            </foreach>
        </insert>

        这种方式通过 values 后面多个小括号赋值的方式进行添加。

      2、方式二

        使用多个 insert 语句进行添加。

        在xml中配置第二种方式:

        <!--
            方式二:这种方式需要数据库连接属性allowMultiQueries=true的支持,允许批量执行SQL语句
            这种分号分割多个SQL可以用于其他的批量操作(删除,修改)
        -->
        <insert id="addEmps">
            <foreach collection="emps" item="emp" separator=";">
                insert into tbl_employee(last_name, email, gender, dept_id)
                values
                (#{emp.lastName}, #{emp.email}, #{emp.gender}, #{emp.department.id})
            </foreach>
        </insert>
        通过多个执行多个 insert 语句来进行插入。
              注意:这种方式需要数据库支持allowMultiQueries,把这个属性设置为 true。
     

      3、测试

        @Test
         public void testBatchInsert() throws IOException {
              //1、获取 sqlSessionFactory
              SqlSessionFactory sqlSessionFactory = getsqlSessionFactory();
    
              //2、获取 sqlSession 实例,能直接执行已经映射的 SQL 语句
              SqlSession sqlSession = sqlSessionFactory.openSession();
    
              try {
                   EmployeeMapperDynamicSQL mapper = sqlSession.getMapper(EmployeeMapperDynamicSQL.class);
                   ArrayList<Employee> list = new ArrayList<Employee>(){{
                        add(new Employee(null, "John2", "1", "John@126.com", new Department(1)));
                        add(new Employee(null, "Smith2", "0", "Smith@126.com", new Department(2)));
                   }};
                   mapper.addEmps(list);
                   sqlSession.commit();
              } finally {
                   sqlSession.close();
              }
         }

    三、Oracle 实现批量插入

      Oracle 批量插入的两种方式
      Oracle不支持 values(),(),()
      Oracle 支持的批量方式
        (1)多个insert放在begin-end里面;
        (2)利用中间表;

      1、方式一

        Oracle不支持values(),(),() 方法,Oracle所支持的批量方式多个 insert 放在 begin-end; 里面
        Oracle 方式:
    begin
        insert into  employees(employee_id,last_name,email)
        values(employees_seq.nextval,'test_001','test_001@126.com');
        insert into  employees(employee_id,last_name,email)
        values(employees_seq.nextval,'test_002','test_002@126.com');
    end;
    

        在 xml 中实现第一种方式:

        <!--
            方式一:Oracle 第一种批量方式
        -->
        <insert id="addEmps" databaseId="oracle">
            <foreach collection="emps" item="emp" separator=";" open="begin" close="end;">
                insert into employees(employee_id, last_name, email)
                values
                (employees_seq.nextval, #{emp.lastName}, #{emp.email});
            </foreach>
        </insert>
     

      2、方式二

        利用中间表插入数据:

    insert into employees(employee_id, last_name, email)
    select employee_seq.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
    )
    

      

        在 xml 中实现第二种方式:

        <!--
            方式二:Oracle 第二种批量方式
        -->
        <insert id="addEmps" databaseId="oracle">
            insert into employees(employee_id, last_name, email)
            select employee_seq.nextval, lastName, email from (
                <foreach collection="emps" item="emp" separator="union">
                    select #{emp.lastName} lastName, #{emp.email} email from dual
                </foreach>
            )
    
        </insert>

      3、测试

         @Test
         public void testBatchSaveByOracle() throws IOException {
              //1、获取 sqlSessionFactory
              SqlSessionFactory sqlSessionFactory = getsqlSessionFactory();
    
              //2、获取 sqlSession 实例,能直接执行已经映射的 SQL 语句
              SqlSession sqlSession = sqlSessionFactory.openSession();
    
              try {
                   EmployeeMapperDynamicSQL mapper = sqlSession.getMapper(EmployeeMapperDynamicSQL.class);
                   ArrayList<Employee> list = new ArrayList<Employee>(){{
                        add(new Employee(null, "John2", "1", "John@126.com"));
                        add(new Employee(null, "Smith2", "0", "Smith@126.com"));
                   }};
                   mapper.addEmps(list);
                   sqlSession.commit();
              } finally {
                   sqlSession.close();
              }
         }

     

  • 相关阅读:
    数据库事务查看
    在SQL中删除重复记录(多种方法)
    OO设计原则
    NHibernate开源框架Cuyahoga学习之权限映射
    链队列的实现
    二叉树的实现
    NHibernate.cfg.xml文件配置
    HQL查询实例
    对象枚举遍历实现二
    NHibernate开源框架Cuyahoga学习之数据访问泛型约束的实现
  • 原文地址:https://www.cnblogs.com/niujifei/p/15242439.html
Copyright © 2011-2022 走看看