栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Mybatis批量插入的4种方式以及效率对比

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Mybatis批量插入的4种方式以及效率对比

分别测试500条,5000条,50000条

1.批处理
    @Autowired
    UserMapper usersMapper;
    @Autowired
    SqlSessionFactory sqlSessionFactory;
    public List list = new ArrayList<>();
    
    @org.junit.Test
    public void batchInsert() {
        long start = System.currentTimeMillis();
        User user;
        for (int i = 1; i <=5000 ; i++) {
            user = new User();
            user.setName("java");
            user.setAge(200);
            user.setManagerId(222);
            list.add(user);
        }
        System.out.println("拼装数据 耗时:"+(System.currentTimeMillis()-start));
        System.out.println(list.size());

        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH,false);
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        System.out.println("batchInsert 插入开始========");
        long start1 = System.currentTimeMillis();
        for (int i = 0; i < list.size(); i++) {
            mapper.insert(list.get(i));
            if (i%1000==0) {
                sqlSession.flushStatements();
            }
        }
        sqlSession.flushStatements();
        System.out.println("SqlSession 批量插入耗时:"+(System.currentTimeMillis()-start1));
    }

500条,批量插入耗时:632ms

5000条,批量插入耗时:1039ms

50000条,批量插入耗时:2891ms

2.sql插入
  
   @Autowired
    UserMapper usersMapper;
    @Autowired
    SqlSessionFactory sqlSessionFactory;
    public List list = new ArrayList<>();
    
    @org.junit.Test
    public void sqlInsert() {
        long start = System.currentTimeMillis();
        User user;
        for (int i = 1; i <=50000 ; i++) {
            user = new User();
            user.setName("java");
            user.setAge(200);
            user.setManagerId(222);
            list.add(user);
        }
        System.out.println("拼装数据 耗时:"+(System.currentTimeMillis()-start));
        System.out.println(list.size());

        System.out.println("sql 插入开始========");
        long start1 = System.currentTimeMillis();
        usersMapper.sqlInsert(list);
        System.out.println("sql 插入耗时:"+(System.currentTimeMillis()-start1));
    }

@Mapper
@Repository
public interface UserMapper extends baseMapper {
    @InsertProvider(type = UsersProvider.class, method = "insertListSql")
    void sqlInsert(List list);
    
    void xmlBatchInsert(@Param("list") List list);
}
public class UsersProvider {
    public String insertListSql(List list) {
        StringBuffer sqlList = new StringBuffer();

        sqlList.append(" INSERT INTO t_user(name,age,manager_id)  VALUES ");
        for (int i = 0; i < list.size() ; i++) {
            User user = list.get(i);
            sqlList.append(" (").append("'").append(user.getName()).append("',").append(user.getAge())
                    .append(",").append(user.getManagerId()).append(")");
            if (i < list.size()-1) {
                sqlList.append(",");
            }
        }
        return sqlList.toString();
    }
}

500条,插入耗时:330ms

5000条,插入耗时:559ms

50000条,插入耗时:1346ms

3.java代码for循环+事务

 @Autowired
    UserMapper usersMapper;
    @Autowired
    SqlSessionFactory sqlSessionFactory;
    public List list = new ArrayList<>();
 
    @org.junit.Test
    @Transactional
    public void forEachInsert() {
        long start = System.currentTimeMillis();
        User user;
        for (int i = 1; i <=5000 ; i++) {
            user = new User();
            user.setName("java");
            user.setAge(200);
            user.setManagerId(222);
            list.add(user);
        }
        System.out.println("拼装数据 耗时:"+(System.currentTimeMillis()-start));
        System.out.println(list.size());

        System.out.println("forEachInsert 插入开始========");
        long start1 = System.currentTimeMillis();
        for (int i = 0; i < list.size(); i++) {
            usersMapper.insert(list.get(i));
        }
        System.out.println("foreach 插入耗时:"+(System.currentTimeMillis()-start1));
    }

500条,插入耗时:1030ms

5000条,插入耗时:4947ms

50000条,插入耗时:15633ms

4.foreach
   @Autowired
    UserMapper usersMapper;
    @Autowired
    SqlSessionFactory sqlSessionFactory;
    public List list = new ArrayList<>();

 @org.junit.Test
    public void forEachXml() {
        long start = System.currentTimeMillis();
        User user;
        for (int i = 1; i <=500 ; i++) {
            user = new User();
            user.setName("java");
            user.setAge(200);
            user.setManagerId(222);
            list.add(user);
        }
        System.out.println("拼装数据 耗时:"+(System.currentTimeMillis()-start));
        System.out.println(list.size());

        System.out.println("forEachInsert 插入开始========");
        long start1 = System.currentTimeMillis();
      usersMapper.xmlBatchInsert(list);
        System.out.println("foreach 插入耗时:"+(System.currentTimeMillis()-start1));
    }




    
        INSERT INTO t_user(id,name,age,manager_id)  VALUES
        
            (#{item.id},
            #{item.name},
            #{item.age},
            #{item.managerId})
        
    

   
        select * from tb_dept_bigdata  where  id in
        
            #{id}
        
    

500条,插入耗时:586ms

5000条,插入耗时:1081ms

50000条, 报错!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/710543.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号