mybatis批量插入三種方式效率比較


向數據庫里插入10000條數據,分別使用三種插入方式,比較三種方式效率,第一種用時3000ms,第二種用時1500ms,第三種800ms,第三種效率最高。

package com.zhanghw.mybatisbatch;

import com.zhanghw.mybatisbatch.entity.User;
import com.zhanghw.mybatisbatch.mapper.UserMapper;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class MybatisBatchApplicationTests {
    @Autowired
    private UserMapper userMapper;

    @Autowired
    private SqlSessionTemplate sqlSessionTemplate;

    /**
     * 通過簡單循環批量插入
     * @throws Exception
     */
    @Test
    public void testInsertBatch1() throws Exception {
        long start = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            User user = User.builder().age(i).name("zhangsan" + i).password(i + "xxxx").sex("").build();
            int insert = userMapper.insert(user);
            System.out.println(insert);
        }
        long end = System.currentTimeMillis();
        System.out.println("-------時間3188--------" + (start - end) + "---------------");
    }
    /**
     * session使用批量模式插入數據
     */
    @Test
    public void testInsertBatch2()  {
        long start = System.currentTimeMillis();
        //跟上述sql區別,將session設置為批量形式
        SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory()
                .openSession(ExecutorType.BATCH, false);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        for (int i = 0; i < 10000; i++) {
            User user = User.builder().age(i).name("zhangsan" + i).password(i + "xxxx").sex("").build();
            int insert = mapper.insert(user);
            System.out.println(insert);
        }
        sqlSession.commit();
        long end = System.currentTimeMillis();
        System.out.println("----時間1535-----------" + (start - end) + "---------------");
    }

    /**
     * 通過foreach標簽完成批量插入
     */
    @Test
    public void testInsertBatch3()  {
        long start = System.currentTimeMillis();
        List<User> list = new ArrayList<>();
        for (int i = 0; i < 10000; i++) {
            User user = User.builder().age(i).name("zhangsan" + i).password(i + "xxxx").sex("").build();
            list.add(user);
        }
        int i = userMapper.insertBatch(list);
        System.out.println(i);
        long end = System.currentTimeMillis();
        System.out.println("----時間824-----------" + (start - end) + "---------------");
    }

}

對應的mapper:

package com.zhanghw.mybatisbatch.mapper;

import com.zhanghw.mybatisbatch.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface UserMapper {
    public int insert(User user);

    public int insertBatch(@Param("list") List<User> list);
}

對應mapper的xml配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhanghw.mybatisbatch.mapper.UserMapper">
    <insert id="insert">
    INSERT INTO user ( name,password,sex,age)
      VALUES( #{name}, #{password}, #{sex}, #{age})
    </insert>

    <insert id="insertBatch" parameterType="com.zhanghw.mybatisbatch.entity.User">
        INSERT INTO user (name,password,sex,age)
        VALUES
        <foreach collection ="list" item="user" separator =",">
            (#{user.name}, #{user.password}, #{user.sex}, #{user.age})
        </foreach >
    </insert>
</mapper>

 


免責聲明!

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



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