批量插入
批量操作使用 foreach
标签插入元素是毫无疑问的,但是不同的数据库对于批量插入的语法可能存在差异。
单条插入的语法 Oracle 和MySQL是一致的,但是Oracle的多条插入语句明显和其他数据库不同。
INSERT INTO tableName(column1,column2....) values('v1','v2'...);
当然某些情况下,我们需要从一个表复制数据,然后把数据插入到一个已存在的表中。
-
我们可以从一个表中复制所有的列插入到另一个已存在的表中:
INSERT INTO table2 SELECT * FROM table1;
-
只复制希望的列插入到另一个已存在的表中:
INSERT INTO table2 (column_name(s)) SELECT column_name(s) FROM table1;
1. Oracle
Oracle 批量插入语法
语法一:
insert into <tableName>[(<table_column1>,<table_column2>...)]
select [<column_value1>,<column_value2>...] from dual
[ union [ALL] select [<column_value1>,<column_value2>...] from dual ]...
语法二:
insert all
into <tableName>[(<table_column1>,<table_column2>...)] values([<column_value1>,<column_value2>...])
[into <tableName>[(<table_column1>,<table_column2>...)] values([<column_value1>,<column_value2>...])]...
select 1 from dual;
引用博客: ORACLE 批量插入(Insert)详解
Mybatis 批量插入
知道在Oracle 批量插入的语法后,转化为对应的mybatis语法即可。
java 实体类
//lombok 自动生成getter/setter 方法
@Data
public User{
private String userName;
private String userCode;
private String email;
}
Mapper
@Mapper
public UserMapper{
int insertUsers(List<User> users);
}
List<User> users = new ArrayList<>();
// 向users 添加数据
int inserts = userMapper.insertUsers(users);
方式1
使用 INSERT ALL
<insert id="insertUsers">
INSERT ALL
<foreach collection="users" item="user">
INTO TEST.TEST_USER
(USER_NAME,USER_CODE,USER_EMAIL)
VALUES
(#{user.userName},#{user.userCode},#{user.email})
</foreach>
SELECT 1 FROM DUAL
</insert>
方式2
没有 values
、没有 select 1 from dual
,同时separator="UNION ALL"
<insert id="insertUsers">
INSERT INTO TEST.TEST_USER
(USER_NAME,USER_CODE,USER_EMAIL)
<foreach collection="users" item="user" separator="UNION ALL">
SELECT #{user.userName},#{user.userCode},#{user.email} FROM DUAL
</foreach>
</insert>
方式3
<insert id="insertUsers">
BEGIN
<foreach collection="list" item="item" index="index" separator="">
insert into TEST.TEST_USER
(USER_NAME,USER_CODE,USER_EMAIL)
VALUES
(#{user.userName},#{user.userCode},#{user.email});
</foreach>
COMMIT;
END;
</insert>
2. Mysql
<insert id="insertUsers">
INSERT INTO user(USER_NAME,USER_CODE,USER_EMAIL) VALUES
<foreach collection="users" item="user" seperator=",">
(#{user.userName},#{user.userCode},#{user.email})
</foreach>
</insert>
SQLserver的批量插入和mysql 一致
批量删除
批量删除语句差异较小
DELETE FROM USER WHERE CODE IN
<foreach collection="users" item="user" open="(" close=")" seperator=",">
#{user.userCode}
</foreach>
批量更新
Oracle
<update id="updateUsers" >
<foreach collection="users" item="user" index="index" open="begin" close=";end;" separator=";">
UPDATE TEST.TEST_USER
<set>
<if test="user.email!= null">
USER_EMAIL= #{user.email},
</if>
<if test="user.userName!= null">
USER_NAME= #{user.userName}
</if>
</set>
where USER_CODE = #{user.userCode}
</foreach>
</update>
原文:
mybatis oracle:批量操作(增删改查)