你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

Mybatis 批量操作

2021/12/31 18:01:58

批量插入

批量操作使用 foreach 标签插入元素是毫无疑问的,但是不同的数据库对于批量插入的语法可能存在差异。

单条插入的语法 Oracle 和MySQL是一致的,但是Oracle的多条插入语句明显和其他数据库不同。

INSERT INTO tableName(column1,column2....) values('v1','v2'...);

当然某些情况下,我们需要从一个表复制数据,然后把数据插入到一个已存在的表中。

  1. 我们可以从一个表中复制所有的列插入到另一个已存在的表中:

    INSERT INTO table2 SELECT * FROM table1;
    
  2. 只复制希望的列插入到另一个已存在的表中:

    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:批量操作(增删改查)