当前位置:

首页 > 编程开发 > 怎么使用springboot+mybatis快速插入大量数据

怎么使用springboot+mybatis快速插入大量数据

一.JDBC实现方案用一个for循环,把数据一条一条地插入;生成一条插入sql,类似这种insertintouser(name,pwd)values('aa','123'),('cc','123')...第一种方案,是用for语句循环插入:该方案的优势在于,JDBC中的PreparedStatement有预编译功能,预编译之后会缓存起来。之后SQL执行会比较快,且JDBC可以开启批处理,这个批处理执行非常给力。劣势在于,很多时候我们的SQL服

本文目录

    一. JDBC实现方案

    用一个 for 循环,把数据一条一条地插入;生成一条插入 sql,类似这种 insert into user(name,pwd) values('aa','123'),('cc','123')...

    第一种方案,是用 for语句循环插入:

    该方案的优势在于,JDBC 中的 PreparedStatement 有预编译功能,预编译之后会缓存起来。之后SQL执行会比较快,且 JDBC可以开启批处理,这个批处理执行非常给力。

    劣势在于,很多时候我们的 SQL 服务器和应用服务器可能并不是同一台,所以必须要考虑网络 IO。如果网络 IO 比较费时间的话,那么可能会拖慢 SQL 执行的速度。

    第二种方案,是生成一条 SQL进行插入:

    该方案的优势在于,只有一次网络 IO。即使分片处理也只是数次网络 IO,所以这种方案不会在网络 IO 上花费太多时间。

    当然这种方案也有劣势。一是 SQL 太长了,甚至可能需要分片后批量处理;二是无法充分发挥 PreparedStatement 预编译的优势,SQL 要重新解析且无法复用;三是最终生成的 SQL 太长了,数据库管理器解析这么长的 SQL 也需要时间。

    我们接下来会采用第二种方案进行实现。

    二. 具体实现思路

    如果我们想要拉高插入效率,肯定不能够一条一条地插入了,必须得使用foreach批量插入;

    采用多线程进行异步插入,提升性能;

    我们不可能单次提交多个insert,大量的插入操作会很耗时,短时间内完不成,可以采用定时任务来实现。

    接下来我们就来说说具体该怎么利用代码进行实现。

    三. 代码实现

    本案例主要是基于SpringBoot整合mybatis进行实现。

    1.导入依赖

        
            org.springframework.boot
            spring-boot-starter-parent
            2.3.4.RELEASE
        
        
            
                org.springframework.boot
                spring-boot-starter-web
            
            
                mysql
                mysql-connector-java
                5.1.48
            
            
                org.mybatis.spring.boot
                mybatis-spring-boot-starter
                2.1.0
            
            
                org.projectlombok
                lombok
            
            
                org.springframework.boot
                spring-boot-starter-test
            
        

    2.创建启动类

    @SpringBootApplication  //引导类核心注解
    @EnableScheduling //开启定时任务
    public class BatchApplication {
        public static void main(String[] args) {
            SpringApplication.run(BatchApplication.class,args);
        }
    }

    3.配置文件application.yml

    server:
      port: 9999  # 指定端口号
    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
        username: root
        password: 123
    mybatis:
      mapper-locations: classpath:mybatis/*.xml   #指定mapper映射文件路径
      type-aliases-package: com.qfedu.model  # 别名

    4.创建表与实体类User

    创建表:

    CREATE TABLE `user` (
      `id` INT(11) NOT NULL AUTO_INCREMENT,
      `username` VARCHAR(30) DEFAULT NULL,
      `pwd` VARCHAR(20) DEFAULT NULL,
      `sex` INT(11) DEFAULT NULL,
      `birthday` DATETIME DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8

    注意:MyISAM效率会比INNODB快。

    User.java

    @Data
    public class User {
        private int id;
        private String username;
        private String pwd;
        private int sex;
        private LocalDate birthday;
    }

    5.持久层mapper和映射文件

    UserMapper.java

    @Mapper
    public interface UserMapper {
        void insertBatch(@Param("userList") List userList);
    }

    UserMapper.xml

    
    
    
        
            insert  into user (username,pwd,sex,birthday) values
            
                (#{item.username}, #{item.pwd}, #{item.sex}, #{item.birthday})
            
        
    

    6.开启定时任务

    SpringBoot默认整合了scheduled,使用步骤如下:

    在引导类加入@EnableScheduling注解,开启定时任务;

    在业务层方法上加入 @Scheduled注解,定义cron表达式周期执行。

    业务层方法中开启的线程可以根据当前机器的配置来修改。我们这里开了7个线程,每个线程去执行20次循环,一次添加5000条数据。这里要注意mybatis批量插入时,不建议超过10000条错误。因为数据量过大,容易出现栈内存溢出的问题。

    @Component
    public class UserServiceImpl {
        @Autowired
        private UserMapper userMapper;
        @Autowired
        //线程池
        private ThreadPoolExecutor executor;
        @Scheduled(cron = "0/20 * * * * ?") //每隔20秒执行一次
        public void  addList(){
            System.out.println("定时器被触发");
            long start = System.currentTimeMillis();
            for (int i = 0; i < 7; i++) {
     
                Thread thread = new Thread(() -> {
                    try {
                        for (int j = 0; j < 20; j++) {
                            userMapper.addList(UserUtil.getUsers(5000));
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                });
                try {
                    executor.execute(thread);
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
            }
        }
    }

    7.生成对象的util

    我们用来模拟生成要插入的数据,实际业务开发的时候可以是从excel中导入的数据。

    public class UserUtil {
        private static Random random = new Random();
        public static List getUsers(int num){
            List users = new ArrayList<>();
            for (int i = 0;i

    8.线程池配置

    线程池参数:

    corePoolSize 核心线程数,在线程池中要保证的最小线程数;

    mainumPoolSize 最大线程数,线程池中能运行的最大线程数;

    keepAliveTime 保证存活时间,当线程空闲时间,多久会回收线程;

    unit 和keepAliveTime配合使用,时间单位;

    workQueue 工作队列,用于存储任务在任务被执行之前。

    @Configuration
    public class ThreadPoolExecutorConfig {
        @Bean
        public ThreadPoolExecutor threadPoolExecutor() {
            //线程池中6个线程,最大8个线程,用于缓存任务的阻塞队列数5个
            ThreadPoolExecutor executor = new ThreadPoolExecutor(6, 8, 5, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100));
            executor.allowCoreThreadTimeOut(true);//允许超时
            return executor;
        }
    }

    9.完整项目结构

    怎么使用springboot+mybatis快速插入大量数据

    10.测试

    怎么使用springboot+mybatis快速插入大量数据

    怎么使用springboot+mybatis快速插入大量数据

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    MyBatis XML开发全面完整指南
    MyBatis XML开发全面完整指南

    MyBatisXML开发方式适合复杂SQL逻辑,通过配置数据库连接与mapper路径,在接口和XML映射文件中实现增删改查操作。XML支持多表查询及结果映射,#{}使用预编译防注入,${}直接拼接需注意字符串引号。

    MyBatis Mapper 接口原理与实现解析
    MyBatis Mapper 接口原理与实现解析

    MyBatis通过动态代理自动生成Mapper接口实现类,运行时将接口方法绑定到SQL语句,结合XML映射文件中的SQL与参数配置,由SqlSession执行并返回结果,避免了手动编写实现类的繁琐过程。

    MyBatis框架常见问题及解决方案
    MyBatis框架常见问题及解决方案

    MyBatis常见问题包含:1.实体类属性与数据库字段不一致,解决方案为使用@Column注解映射;2.执行更新操作失败,需要配置update元素并检查SQL语句;3.查询结果映射出错,需检查resultMap配置是否正确;4.解析SQL参数失败,要使用#{}占位符并确保参数类型匹配。

    MyBatis框架中设计模式的应用
    MyBatis框架中设计模式的应用

    MyBatis框架广泛应用设计模式,包括:工厂模式:创建SqlSessionFactory对象,管理数据库连接和查询;代理模式:实现延迟加载和懒加载,提高性能。外观模式:封装对数据库访问,简化代码维护。其中,一对多关系映射可以通过User和Order类、Mapper接口和MapperXML配置实现,使用延迟加载和嵌套resultMap优化性能。

    MyBatis 的动态 SQL 解析:原理、实现和优化
    MyBatis 的动态 SQL 解析:原理、实现和优化

    MyBatis动态SQL解析:原理:使用TAG和OGNL表达式动态构建SQL语句。实现:通过SqlNode、SqlSource和ParameterHandler接口实现。优化:避免不必要的动态SQL、优化OGNL表达式、使用PreparedStatement缓存和配置查询超时。

    springBoot项目常用目录有哪些
    springBoot项目常用目录有哪些

    springBoot项目常用目录springBoot项目的目录结构及名规范介绍基于SpringBoot开发时的目录结构及命名规范,通过介绍能够为你解决,在实际项目中如何规划目录结构?如何命名目录更规范?各个目录分别代表什么含义?等三个问题。目录说明servicex//项目名|-admin-ui//管理服务前端代码(一般将UI和SERVICE放到一个工程中,便于管理)|-servicex-auth//模块1|-servicex-common//模块2|-servicex-gateway//模块3|-serv

    正确使用MyBatis中的小于符号
    正确使用MyBatis中的小于符号

    MyBatis是一个用Java语言编写的持久层框架,广泛用于数据库操作。在MyBatis中,使用小于号(<)进行条件查询是很常见的操作。但是,小于号在MyBatis中有一些使用注意事项,本文将介绍MyBatis小于号的正确使用方法,并提供具体的代码示例。1.在MyBatis中使用小于号的基本方法在MyBatis中使用小于号进行条件查询,一般是在SQL

    解析MyBatis的缓存机制:比较一级缓存和二级缓存的使用场景
    解析MyBatis的缓存机制:比较一级缓存和二级缓存的使用场景

    MyBatis的缓存机制解析:一级缓存与二级缓存的区别与应用在MyBatis框架中,缓存是一个非常重要的特性,可以有效提升数据库操作的性能。其中,一级缓存和二级缓存是MyBatis中常用的两种缓存机制。本文将详细解析一级缓存与二级缓存的区别与应用,并提供具体的代码示例进行说明。一、一级缓存一级缓存也被称为本地缓存,它默认开启且不可关闭。一级缓存是SqlSes

    深入了解MyBatis缓存机制:揭秘缓存存储原理
    深入了解MyBatis缓存机制:揭秘缓存存储原理

    MyBatis缓存机制详解:一文读懂缓存存储原理引言在使用MyBatis进行数据库访问时,缓存是一个非常重要的机制,能够有效减少对数据库的访问,提高系统性能。本文将详细介绍MyBatis的缓存机制,包括缓存的分类、存储原理和具体的代码示例。一、缓存的分类MyBatis的缓存主要分为一级缓存和二级缓存两种。一级缓存一级缓存是SqlSession级别的缓存,当在

    详解在MyBatis中使用小于符号的方法
    详解在MyBatis中使用小于符号的方法

    MyBatis中小于号的写法详解MyBatis是一个优秀的持久层框架,广泛应用于Java开发中。在使用MyBatis进行数据库操作的过程中,我们经常会用到小于号(<)进行条件查询。但是,MyBatis中小于号的写法并不像普通的SQL语句那样直接使用小于号符号,而是需要使用特定的方式来实现。本文将详细解释MyBatis中小于号的写法,并提供具体的代码示例

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。