随笔 - 1162  文章 - 0  评论 - 16  阅读 - 59万 

一、批量插入

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

1
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 方式:
1
2
3
4
5
6
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、方式二

    利用中间表插入数据:

1
2
3
4
5
6
7
8
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();
          }
     }
复制代码

 

 

 

 

posted on   格物致知_Tony  阅读(5165)  评论(1编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示

目录导航