Mybatis快速批量插入10万条数据实战

2024-06-19 15:12

本文主要是介绍Mybatis快速批量插入10万条数据实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用Mybatis大概有以下4种常见插入方法

1.使用for循环,每次执行一次insert插入(效率低不推荐)
2.使用MyBatis的标签遍历插入(效率低不推荐)
3.使用Mybatis,纯sql插入(推荐,效率最高)
4.使用 SqlSessionFactory,每一批数据执行一次提交(重点推荐)

下面直接推荐两种快速高效的方法,第一种需要手动拼写sql,比较麻烦,但是效率高一些,建议直接使用第二种方法比较方便,效率都差不多,下面两种方式都同时支持Oracle和Mysql

开启数据库批量插入

由于Oracle默认已经开启批量插入,Mysql需要手动开启,需要在连接url后面加上&rewriteBatchedStatements=true

jdbc:mysql://127.0.0.1:3306/szx_blog?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&&rewriteBatchedStatements=true

第一种:使用Mybatis,纯sql插入(推荐使用)

动态创建Sql拼接
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();}
}
在Mapper接口种指定该方法
//sql插入相关方法
@Repository
public interface UsersMapper extends BaseMapper<Users> {//调用Sql方法@InsertProvider(type = UsersProvider.class, method = "insertListSql")public void sqlInsert(List<Users> list);
}
批量插入测试方法
@Test
public void sqlInsert() {// 批量插入计时开始StopWatch sw = new StopWatch();sw.start();// sql插入数据usersMapper.sqlInsert(list);System.out.println("sql方法批量插入耗时:"+(sw.getTotalTimeMillis()));
}

经过博主测试10万条数据大概在5秒左右

第二种 SqlSessionFactory批量插入

    @Testpublic void batchInsert() {// 创建sqlSession 开启批量插入SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH,false);// 获取要批量的MapperUsersMapper usersMapper = sqlSession.getMapper(UsersMapper.class);System.out.println("batchInsert 插入开始");// 批量插入计时开始StopWatch sw = new StopWatch();sw.start();try {for (int i = 0; i < list.size(); i++) {// 调用insert方法usersMapper.insert();// 每3000条插入一次if (i % 3000 == 0 || i == list.size() - 1) {sqlSession.flushStatements();log.info("提交成功");}}} catch (Exception e) {sqlSession.rollback();log.info("批量插入失败,原因:{}",e.getMessage());e.printStackTrace();}finally {sqlSession.close();log.info("关流成功");}
//        sqlSession.commit();
//        sqlSession.clearCache();sqlSession.flushStatements();System.out.println("SqlSession 批量插入耗时:"+(sw.getTotalTimeMillis()));}

经过测试插入10万条数据大概在15秒左右

这篇关于Mybatis快速批量插入10万条数据实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1075378

相关文章

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数