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(); } }

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM