SpringBoot使用mybatis批量新增500万数据到mysql数据库Demo

SpringBoot使用mybatis批量新增500万数据到mysql数据库Demo

  • 说明
  • 项目Demo代码地址
  • 项目目录
  • mysql对应表建表语句
  • pom.xml
  • application.yml配置类
  • 启动类代码
  • OrderInfo 实体类
  • TestController控制层
  • 接口层TestService
  • TestServiceImpl实现层
  • TestDao数据接口层
  • dao层对应mapper.xml自定义sql语句
  • 测试结果如下

说明

记录下学习mysql批量新增百万数据。留着以后备用。
本地环境mysql安装的5.7版本,项目使用jdk1.8版本,项目使用的mysql驱动版本为8.0版本。

项目Demo代码地址

SpringBoot使用mybatis批量新增500万数据到mysql数据库Demo

项目目录

在这里插入图片描述

mysql对应表建表语句

CREATE TABLE `order_info` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',`period` int(11) NOT NULL COMMENT '账期月份',`amount` decimal(20,2) NOT NULL COMMENT '金额',`user_name` varchar(20) NOT NULL COMMENT '下单人',`phone` varchar(11) NOT NULL COMMENT '手机号',`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`creator` varchar(20) NOT NULL COMMENT '创建人',`modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',`modifier` varchar(20) NOT NULL COMMENT '修改人',PRIMARY KEY (`id`) USING BTREE,KEY `idx_period` (`period`),KEY `idx_modified` (`modified`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='订单信息表';

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.3</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>batching</artifactId><version>0.0.1-SNAPSHOT</version><name>batching</name><description>batching</description><properties><java.version>1.8</java.version><!--下列版本都是2022/04/16最新版本,都是父项目的基本依赖,用来子项目继承父项目依赖--><pagehelper-starter.version>1.4.2</pagehelper-starter.version><mybatis.version>3.5.9</mybatis.version><mysql-connector.version>8.0.28</mysql-connector.version><druid.version>1.2.9</druid.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--MyBatis分页插件1.4.2版本才支持spring-boot2.6.6--><!--pagehelper分页官网:https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter/--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>${pagehelper-starter.version}</version></dependency><!-- MyBatis就是用来创建数据库连接进行增删改查等操作,提供了原生JDBC,Connection,Statement,ResultSet这些底层--><!-- MyBatis官网:https://mybatis.org/mybatis-3/zh/dependency-info.html--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><!--Mysql数据库驱动--><!--Mysql驱动官网:https://mvnrepository.com/artifact/mysql/mysql-connector-java/--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql-connector.version}</version></dependency><!--集成druid连接池--><!--druid版本官网:https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

application.yml配置类

server:port: 8080mybatis:mapper-locations:- classpath:mapper/*.xml #找到mybatis位置,自定义sql语句#当查询语句中resultType="java.util.HashMap"时,如果返回的字段值为null时,设置如下参数为true,让它返回configuration:call-setters-on-nulls: truespring:datasource:#mysql批量新增需要在url后面添加rewriteBatchedStatements=true才能生效url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=truedriverClassName: com.mysql.cj.jdbc.Driver #mysql8.0驱动,mysql5.7驱动是com.mysql.jdbc.Driverusername: 你自己数据库的用户名password: 你自己数据库的密码druid:initial-size: 3 #连接池初始大小min-idle: 5 #最小空闲连接数max-active: 20 #最大空闲连接数web-stat-filter:exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" #不统计这些请求数据stat-view-servlet: #访问监控网页的用户名和密码#默认为true,内置监控页面首页/druid/index.htmlenabled: truelogin-username: druidlogin-password: druid

启动类代码

package com.example.batching;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class BatchingApplication {public static void main(String[] args) {SpringApplication.run(BatchingApplication.class, args);}}

OrderInfo 实体类

package com.example.batching.entity;import java.math.BigDecimal;public class OrderInfo {private int id;private int period;//账期月份private BigDecimal amount;//金额private String userName;//下单人private String phone;//手机号private String created;//创建时间private String creator;//创建人private String modified;//修改时间private String modifier;//修改人public int getId() {return id;}public void setId(int id) {this.id = id;}public int getPeriod() {return period;}public void setPeriod(int period) {this.period = period;}public BigDecimal getAmount() {return amount;}public void setAmount(BigDecimal amount) {this.amount = amount;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getCreated() {return created;}public void setCreated(String created) {this.created = created;}public String getCreator() {return creator;}public void setCreator(String creator) {this.creator = creator;}public String getModified() {return modified;}public void setModified(String modified) {this.modified = modified;}public String getModifier() {return modifier;}public void setModifier(String modifier) {this.modifier = modifier;}
}

TestController控制层

package com.example.batching.controller;import com.example.batching.entity.OrderInfo;
import com.example.batching.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;@RestController
@RequestMapping(value = "/order")
public class TestController {@Autowiredprivate TestService testService;//批量新增数据处理@PostMapping(value = "/batchSave")public String batchSave() {//随机生成电话号码String[] start = {"130", "131", "132", "133", "134", "150", "151", "155", "158", "166", "180", "181", "184", "185", "188"};List<OrderInfo> orderInfoList=new ArrayList<>();//生成500万数据批量新增到mysql数据库里面for(int i=1;i<=5000000;i++){OrderInfo orderInfo=new OrderInfo();orderInfo.setPeriod(202206);orderInfo.setAmount(new BigDecimal(i));orderInfo.setUserName("用户"+i);orderInfo.setPhone(start[(int) (Math.random() * start.length)]+(10000000+(int)(Math.random()*(99999999-10000000+1))));orderInfo.setCreator("用户"+i);orderInfo.setModifier("用户"+i);orderInfoList.add(orderInfo);//每一万条数据进行批量新增if(i%10000==0){testService.batchSave(orderInfoList);//新增完成后清空list集合防止内存溢出orderInfoList.clear();System.out.println("当前已新增完数据:"+i+"行");}}return "成功";}
}

接口层TestService

package com.example.batching.service;import com.example.batching.entity.OrderInfo;import java.util.List;public interface TestService {void batchSave(List<OrderInfo> orderInfoList);
}

TestServiceImpl实现层

package com.example.batching.service.impl;import com.example.batching.dao.TestDao;
import com.example.batching.entity.OrderInfo;
import com.example.batching.service.TestService;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.List;@Service
public class TestServiceImpl implements TestService {@Resourceprivate TestDao testDao;@Resourceprivate SqlSessionFactory sqlSessionFactory;@Overridepublic void batchSave(List<OrderInfo> orderInfoList) {//批量新增处理,需要在jdbc连接那里添加rewriteBatchedStatements=true属性,批量新增才能生效// ExecutorType.SIMPLE: 这个执行器类型不做特殊的事情。它为每个语句的执行创建一个新的预处理语句。自动提交不关闭的前提下,默认设置是这个// ExecutorType.REUSE: 这个执行器类型会复用预处理语句。// ExecutorType.BATCH: 这个执行器会批量执行所有更新语句,如果 SELECT 在它们中间执行还会标定它们是 必须的,来保证一个简单并易于理解的行为。//如果自动提交设置为true,将无法控制提交的条数,改为最后统一提交SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);try {TestDao testMapper = sqlSession.getMapper(TestDao.class);orderInfoList.stream().forEach(orderInfo -> testMapper.batchSave(orderInfo));//提交数据sqlSession.commit();} catch (Exception e) {sqlSession.rollback();} finally {sqlSession.close();}}
}

TestDao数据接口层

package com.example.batching.dao;import com.example.batching.entity.OrderInfo;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface TestDao {void batchSave(OrderInfo orderInfo);
}

dao层对应mapper.xml自定义sql语句

<?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">
<!-- namespace必须指向Dao接口 -->
<mapper namespace="com.example.batching.dao.TestDao"><insert id="batchSave" parameterType="com.example.batching.entity.OrderInfo">INSERT INTO order_info<trim prefix="(" suffix=")" suffixOverrides=","><if test="period != null">period,</if><if test="amount != null">amount,</if><if test="userName != null">user_name,</if><if test="phone != null">phone,</if><if test="creator != null">creator,</if><if test="modifier != null">modifier,</if></trim><trim prefix="values (" suffix=")" suffixOverrides=","><if test="period != null">#{period},</if><if test="amount != null">#{amount},</if><if test="userName != null">#{userName},</if><if test="phone != null">#{phone},</if><if test="creator != null">#{creator},</if><if test="modifier != null">#{modifier},</if></trim></insert>
</mapper>

测试结果如下

Postman调用接口返回如下:
在这里插入图片描述
后台控制台打印如下:
在这里插入图片描述
数据库执行接口如下:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/7691.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 226. 翻转二叉树

2023.7.1 这题依旧可以用层序遍历的思路来做。 在层序遍历的代码上将所有节点的左右节点进行互换即可实现二叉树的反转。 下面上代码&#xff1a; class Solution { public:TreeNode* invertTree(TreeNode* root) {queue<TreeNode*> que;if(root nullptr) return{};que…

【Linux】LVS负载均衡群集 DR模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 LVS负载均衡群集 DR模式 数据包流向分析DR 模式的特点LVS-DR中的ARP问题VIP地址相同导致响应冲突返回报文时源地址使用VIP&#xff0c;导致网关设备的ARP缓存表紊乱 DR模式 L…

VUE3笔记

项目结构 模板语法&#xff08;在标签之外&#xff09; 插值语法 &#xff1a;双大括号 属性绑定&#xff08;在标签之内&#xff09; v-bind: 单属性两种写法 多属性绑定 条件渲染 列表渲染 要有key&#xff0c;降低消耗 遍历数组 遍历对象 事件处理 传递参数 事件修…

gerrit 遇到的问题汇总

更新远程代码 git pull --rebase 回退到指定版本 get reset --hard commitid 修改之前的提交 git commit --amend 问题一 本地提交了两个记录到远程&#xff0c;远程还没有合并&#xff0c;本地使用 git reset --soft HEAD~1 回退到了上一个提交&#xff0c;现在需要将本地…

微信小程序全局数据共享

1.概念 全局数据共享(又叫做&#xff1a;状态管理)是为了解决组件之间数据共享的问题。 2.小程序中共享方案 在小程序中&#xff0c;可使用mobx-miniprogram配合mobx-miniprogram-bindings实现全局数据共享mobx-miniprogram用来创建Store实例对象 mobx-miniprogram-bindings…

浅谈Unicode与UTF-8

我们都知道&#xff0c;在Golang中字符都是以UTF-8编码的形式存储&#xff0c;当我们使用range遍历字符串的时候&#xff0c;go会为我们取出一个字符(rune)而不是一个byte&#xff0c;例如以下例子&#xff0c;我们使用range迭代取出第一个字符“你”&#xff0c;并且打印输出取…

让你不再好奇音频转换格式软件免费有哪些

小美&#xff1a;你好&#xff0c;最近我需要将一些音频文件转换成其他格式&#xff0c;但是不知道常用的音频转换工具有哪些&#xff0c;你有什么建议吗&#xff1f; 李明&#xff1a;当然&#xff0c;有很多音频转换工具可以选择。建议你关注下这篇文章&#xff0c;我将通过…

【动手学习深度学习--逐行代码解析合集】06多层感知机的从零开始实现

【动手学习深度学习】逐行代码解析合集 06多层感知机的从零开始实现 视频链接&#xff1a;动手学习深度学习–softmax回归简洁实现 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v2.d2l.ai/ 1、多层感知机 2、从线性到非线性 3、激活函数 R…

ChatGPT应用工具推荐

ChatGPT作为一种先进的自然生成技术&#xff0c;已经在各个领域展现出了其强大的应用能力&#xff0c;下面将给大家介绍一些ChatGPT的功能应用。 简介 此系统是基于likeadmin—PHP开发的智能对话系统&#xff0c;ChatGPT是一种基于人工智能技术的聊天机器人&#xff0c;它可以…

亚马逊云科技推出Amazon AppFabric,SaaS安全不断加码

亚马逊云科技近日宣布推出Amazon AppFabric来增强公司在软件即服务&#xff08;SaaS&#xff09;应用程序方面的现有投入。Amazon AppFabric是一项无代码服务&#xff0c;可以为客户提高安全性&#xff0c;管理水平和生产力。只需在亚马逊云科技管理控制台上点击几下&#xff0…

机器学习之深度神经网络

目录 卷积神经网络与全连接神经网络 前向后向传播推导 通用手写体识别模型 人脸识别模型 电影评论情感分析模型 卷积神经网络与全连接神经网络 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;和全连接神经网络&#xff08;Fully Conn…

单片机STM32看门狗详解(嵌入式学习)

单片机STM32看门狗 什么是看门狗为什么需要看门狗&#xff1f;STM32CubeMX配置和应用示例独立看门狗&#xff08;IWDG&#xff09;窗口看门狗&#xff08;WWDG&#xff09; 注意事项 什么是看门狗 单片机STM32的看门狗&#xff08;Watchdog&#xff09;是一种硬件定时器&#…