一、批量插入
在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();
}
}