Mybatis插入大量数据效率对比:foreach、SqlSession批量、sql

简介: 使用mybatis插入数据执行效率对比,对比三种方式(测试数据库为MySQL),使用 SqlSessionFactory,每一批数据执行一次提交使用mybatis-plus框架的insert方法,for循环,每次执行一次插入使用ibatis,纯sql插入

使用mybatis插入数据执行效率对比,对比三种方式(测试数据库为MySQL),

  1. 使用 SqlSessionFactory,每一批数据执行一次提交
  2. 使用mybatis-plus框架的insert方法,for循环,每次执行一次插入
  3. 使用ibatis,纯sql插入

新增xml执行效率测试:xml执行时间比sql稍慢一些,50000条数据插入时间约为2000毫秒左右,平均时间是sql的2倍左右。

先贴出执行效果(数字代表执行的时间,单位毫秒):

测试代码:

//测试类
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class Test1 {
    @Autowired
    UsersMapper usersMapper;
    @Autowired
    SqlSessionFactory sqlSessionFactory;
    public List<Users> list = new ArrayList<>();
    @Before
    public void  getList() {
        long start = System.currentTimeMillis();
        Users user;
        for (int i = 1; i <=50000 ; i++) {
            user = new Users();
            user.setId(i);
            user.setName("java");
            user.setAge(200);
            user.setManagerId(222);
            list.add(user);
        }
        System.out.println("拼装数据 耗时:"+(System.currentTimeMillis()-start));
        System.out.println(list.size());
    }
    @Test
    public void batchInsert() {
        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH,false);
        UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);
        System.out.println("batchInsert 插入开始========");
        long start = System.currentTimeMillis();
        for (int i = 0; i < list.size(); i++) {
            mapper.insert(list.get(i));
            if (i%5000==4999) {
                sqlSession.flushStatements();
//                sqlSession.commit();
//                sqlSession.clearCache();
            }
        }
//        sqlSession.commit();
//        sqlSession.clearCache();
        sqlSession.flushStatements();
        System.out.println("SqlSession 批量插入耗时:"+(System.currentTimeMillis()-start));
    }
    @Test
    public void forEachInsert() {
        System.out.println("forEachInsert 插入开始========");
        long start = System.currentTimeMillis();
        for (int i = 0; i < list.size(); i++) {
            usersMapper.insert(list.get(i));
        }
        System.out.println("foreach 插入耗时:"+(System.currentTimeMillis()-start));
    }
    @Test
    public void sqlInsert() {
        System.out.println("sql 插入开始========");
        long start = System.currentTimeMillis();
        usersMapper.sqlInsert(list);
        System.out.println("sql 插入耗时:"+(System.currentTimeMillis()-start));
    }
//xml批量插入
    @Test
    public void xmlInsert() {
        System.out.println("xmlInsert 批量插入开始========");
        long start = System.currentTimeMillis();
        usersMapper.xmlBatchInsert(list);
        System.out.println("xmlInsert 批量插入耗时:"+(System.currentTimeMillis()-start));
    }
}
//sql插入相关类
@Repository
public interface UsersMapper extends BaseMapper<Users> {
    @InsertProvider(type = UsersProvider.class, method = "insertListSql")
    public void sqlInsert(List<Users> list);
    public void xmlBatchInsert(@Param("list") List<Users> list);
}
public class UsersProvider {
    public String insertListSql(List<Users> list) {
        StringBuffer sqlList = new StringBuffer();
        sqlList.append(" INSERT INTO users(id,name,age,manager_id)  VALUES ");
        for (int i = 0; i < list.size() ; i++) {
            Users user = list.get(i);
            sqlList.append(" (").append(user.getId()).append(",").append("'").append(user.getName()).append("',").append(user.getAge())
                    .append(",").append(user.getManagerId()).append(")");
            if (i < list.size()-1) {
                sqlList.append(",");
            }
        }
        return sqlList.toString();
    }
}

xml 插入mapper文件

<?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.example.demo.dao.UsersMapper">
  <insert id="xmlBatchInsert">
    INSERT INTO users(id,name,age,manager_id)  VALUES
    <foreach collection="list" item="item" index="index" separator=",">
      (#{item.id},
      #{item.name},
      #{item.age},
      #{item.managerId})
    </foreach>
  </insert>
</mapper>

总结

sql插入的效率最高,sqlsession次之,mybatis框架foreach插入效率最低。

执行效率echarts图:

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。

相关文章
|
24天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
25天前
|
SQL 存储 缓存
SQL Server 数据太多如何优化
11种优化方案供你参考,优化 SQL Server 数据库性能得从多个方面着手,包括硬件配置、数据库结构、查询优化、索引管理、分区分表、并行处理等。通过合理的索引、查询优化、数据分区等技术,可以在数据量增大时保持较好的性能。同时,定期进行数据库维护和清理,保证数据库高效运行。
|
2月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
58 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
2月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
40 10
|
2月前
|
SQL 移动开发 Oracle
SQL语句实现查询连续六天数据的方法与技巧
在数据库查询中,有时需要筛选出符合特定时间连续性条件的数据记录
|
2月前
|
SQL 存储 关系型数据库
添加数据到数据库的SQL语句详解与实践技巧
在数据库管理中,添加数据是一个基本操作,它涉及到向表中插入新的记录
|
2月前
|
SQL 数据挖掘 数据库
SQL查询每秒的数据:技巧、方法与性能优化
id="">SQL查询功能详解 SQL(Structured Query Language,结构化查询语言)是一种专门用于与数据库进行沟通和操作的语言
|
2月前
|
SQL 监控 数据处理
SQL数据库数据修改操作详解
数据库是现代信息系统的重要组成部分,其中SQL(StructuredQueryLanguage)是管理和处理数据库的重要工具之一。在日常的业务运营过程中,数据的准确性和及时性对企业来说至关重要,这就需要掌握如何在数据库中正确地进行数据修改操作。本文将详细介绍在SQL数据库中如何修改数据,帮助读者更好
259 4
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
90 0
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
41 0