Java 关于批量插入遇到的问题 -sqlserver

序言:

        我们在做项目的时候,经常会遇到,对数据的新增动作,如果数据量很少的情况下,单个新增对性能还好,但是一旦涉及到 大数据量,如十万,百万,千万,这个时候如果采用单个新增,那么整个系统都得瘫痪,响应时间 小时级别了,就可以出门左转,28路公交,火车站,回老家了。

吐槽:

        对于项目而言,性能是最重要的,性能的快慢,对客户的体验和公司的名誉有着直接关系,要想代码写得好,首先围着性能跑。这几天一直在搞大数据插入的功能,自己总结了一些经验,供于各位大佬参考:

1、定时实体
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("Dictionary_Info")
@ApiModel(value="DictionaryInfo对象", description="")
public class DictionaryInfo implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty(value = "主键ID")@TableId(value = "ID", type = IdType.AUTO)private Integer id;@ApiModelProperty(value = "编码")@TableField("DI_Code")private String diCode;@ApiModelProperty(value = "名称")@TableField("DI_Name")private String diName;@ApiModelProperty(value = "描述")@TableField("DI_Desc")private String diDesc;@ApiModelProperty(value = "类型")@TableField("DI_Type")private String diType;@ApiModelProperty(value = "是否删除")@TableField("IsDelete")private Boolean isdelete;@TableField("TS")private Date ts;}
2、定义mapper.xml文件
<?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.walmart.java.sams.api.mapper.OrderplanConfirmMapper"><insert id="insertBs" parameterType="保存数据库的参数实体">
INSERT INTO Dictionary_Info (DI_Code, DI_Name, DI_Desc, DI_Type, IsDelete, TS) VALUES(#{diCode}, #{diName}, #{diDesc}, #{diType}, #{isDelete, #{ts};</insert>
</mapper>
3、定时一个接口

//服务类
public interface IDictionaryInfoService extends IService<DictionaryInfo> {void insertBs(List<DictionaryInfo> list);
}

一、MyBatis 集合方式批量新增

1、定义Mapper
@Mapper
public interface DictionaryInfoMapper extends BaseMapper<DictionaryInfo> {//MyBatis以集合方式批量新增void insertBs(DictionaryInfomodel);
}
2、实现批量插入方法
@Service
//服务实现类
public class DictionaryInfoServiceImpl extends ServiceImpl<DictionaryInfoMapper, DictionaryInfo> implements IDictionaryInfoService {@Autowiredprivate SqlSessionFactory sqlSessionFactory;//MyBatis以集合方式批量新增public void insertBs(List<DictionaryInfo> list) {SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);list.stream().forEach(p -> baseMapper.insertBs(p));sqlSession.commit();sqlSession.clearCache();}public void TestInsert(){long start = System.currentTimeMillis();List<DictionaryInfo> dicList = new ArrayList<>();DictionaryInfo dInfo;for(int i = 0 ;i < 10000; i++) {dInfo.setDiCode("1"+i);dInfo.setDiDesc("2");dInfo.setDiType("c");dInfo.setIsdelete(false);dInfo.setDiName("test");dicList .add(dInfo);}//批量插入insertBs(dicList);}}

二、MyBatis-Plus提供的SaveBatch方法

1、实现批量插入方法
@Service
//服务实现类
public class DictionaryInfoServiceImpl extends ServiceImpl<DictionaryInfoMapper, DictionaryInfo> implements IDictionaryInfoService {@Autowiredprivate SqlSessionFactory sqlSessionFactory;//MyBatis以集合方式批量新增public void insertBs(List<DictionaryInfo> list) {SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);list.stream().forEach(p -> baseMapper.insertBs(p));sqlSession.commit();sqlSession.clearCache();}public void TestInsert(){long start = System.currentTimeMillis();List<DictionaryInfo> dicList = new ArrayList<>();DictionaryInfo dInfo;for(int i = 0 ;i < 10000; i++) {dInfo.setDiCode("1"+i);dInfo.setDiDesc("2");dInfo.setDiType("c");dInfo.setIsdelete(false);dInfo.setDiName("test");dicList .add(dInfo);}//批量插入saveBatch(dicList);}}//服务类
public interface IDictionaryInfoService extends IService<DictionaryInfo> {void insertBs(List<DictionaryInfo> list);
}

三、MyBatis-Plus  的 InsertBatchSomeColumn 

1、自定义 BatchPlusSqlInjector 类
public class BatchPlusSqlInjector extends DefaultSqlInjector {@Override//传入对象,类,反射对象的属性public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));return methodList;}}
2、定时项目启动,加载的核心类
@Configuration
public class MybatisPlusConfig {public BatchPlusSqlInjector sqlInjector() {return new BatchPlusSqlInjector();}
}
3、自定义一个Mapper接口
public interface BatchPlusBaseMapper<T> extends BaseMapper<T> {Integer insertBatchSomeColumn(Collection<T> entityList);
}
4、定义Mapper继承 BatchPlusBaseMapper
@Mapper
public interface DictionaryInfoMapper<T> extends EasyBaseMapper<DictionaryInfo> {}
实现批量插入方法
@Service
//服务实现类
public class DictionaryInfoServiceImpl extends ServiceImpl<DictionaryInfoMapper, DictionaryInfo> implements IDictionaryInfoService {public void TestInsert(){long start = System.currentTimeMillis();List<DictionaryInfo> dicList = new ArrayList<>();DictionaryInfo dInfo;for(int i = 0 ;i < 10000; i++) {dInfo.setDiCode("1"+i);dInfo.setDiDesc("2");dInfo.setDiType("c");dInfo.setIsdelete(false);dInfo.setDiName("test");dicList .add(dInfo);}//批量插入baseMapper.insertBatchSomeColumn(dicList )}}

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

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

相关文章

RabbitMq使用与整合

MQ基本概念 MQ概述 MQ全称 Message Queue&#xff08;[kjuː]&#xff09;&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。 &#xff08;队列是一种容器&#xff0c;用于存放数据的都是容器&#xff0c;存…

优秀的时间追踪软件Timemator for Mac轻松管理时间!

在现代社会&#xff0c;时间管理成为了我们工作和生活中的一大挑战。如果你经常感到时间不够用&#xff0c;无法高效地完成任务&#xff0c;那么Timemator for Mac将成为你的得力助手。 Timemator for Mac是一款出色的时间追踪软件&#xff0c;它可以帮助你精确记录和管理你的…

Linux的基本指令 ( 一 )

目录 前言 Linux基本指令 快速认识五个指令 ls指令 补充内容 pwd指令 补充内容 cd指令 补充内容 重新认识指令 指令的本质 which指令 alias指令 最后 一个文件的三种时间 tree指令及安装 tree指令 前言 关于Linux操作系统的桌面&#xff0c;在学校教学中我们…

实用高效 无人机光伏巡检系统助力电站可持续发展

近年来&#xff0c;我国光伏发电行业规模日益壮大&#xff0c;全球领先地位愈发巩固。为解决光伏电站运维中的难题&#xff0c;浙江某光伏电站与复亚智能达成战略合作&#xff0c;共同推出全自动无人机光伏巡检系统&#xff0c;旨在提高发电效率、降低运维成本&#xff0c;最大…

Spark---SparkCore(一)

一、术语与宽窄依赖 1、术语解释 1、Master(standalone):资源管理的主节点&#xff08;进程&#xff09; 2、Cluster Manager:在集群上获取资源的外部服务(例如&#xff1a;standalone,Mesos,Yarn) 3、Worker Node(standalone):资源管理的从节点(进程)或者说管理本机资源的…

用Python写一个浏览器集群框架

更多Python学习内容&#xff1a;ipengtao.com 在分布式爬虫和大规模数据采集的场景中&#xff0c;使用浏览器集群是一种有效的方式&#xff0c;可以提高数据采集的速度和效率。本文将介绍如何用Python编写一个简单但强大的浏览器集群框架&#xff0c;以应对需要使用多个浏览器实…

WebGL/threeJS面试题扫描与总结

什么是 WebGL&#xff1f;什么是 Three.js&#xff1f;请解释three.js中的WebGL和Canvas的区别&#xff1f; WebGL(全写Web Graphics Library)是一种3D绘图协议&#xff0c;这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起&#xff0c;通过增加OpenGL ES 2.0的一个…

分库分表、分布式数据库、MPP

分库分表、分布式数据库、MPP的区别吗&#xff1f; 一、MySQL分库分表和MySQL分布式集群在性能方面各有优劣&#xff0c;具体取决于应用场景和需求。 MySQL分库分表&#xff1a; 在分库分表的场景下&#xff0c;可以将负载分散到多个数据库实例上&#xff0c;从而提高整体性能…

【模糊测试】课堂笔记

模糊测试 模糊测试过程通常是自动化的。这个过程经典地分为以下几个阶段。 准备&#xff1a;这是第一阶段&#xff0c;重点是 SUT 输入和输出格式的识别和规范。基于此&#xff0c;规范可以减少生成初始无效模糊数据的可能性并创建有效且精确的输入。Fuzz Data Generation&am…

思科模拟器操作命令

模式 思科模拟器常见的模式有 用户模式 能够操作的命令比较少 特权模式特权模式下面可以操作的比较多 全局模式 接口模式 用户模式进入特权模式: 命令enable 特权模式进行全局模式命令: configure terminal 退出命令 exit命令&#xff1a;返回上一层&#xff0c;即一步一步…

RocketMQ 消息中间件 知识点汇总

目录 RocketMQ1、什么是RocketMQ?常用术语:2、为什么需要消息队列3、什么是异步处理4、什么是服务解耦5、什么是流量控制6、消息队列两种模型队列模型:发布/订阅模型:总结:7、怎么保证消息不丢失8、如何处理消息被重复消费**出现消息重复的情况:****解决方法:**9、如何保…

流量分析-PhishingEmail_WriteUp

一、题目问题 问题1&#xff1a;黑客的email名称 问题2&#xff1a;黑客向几人发送了钓鱼邮件 问题3&#xff1a;黑客传输的木马文件名 问题4&#xff1a;下载并运行了木马文件的人的email名称和ip地址&#xff0c;用“-”连接 问题5&#xff1a;黑客用于反弹shell的主机i…

什么葡萄酒会适用这种双重滗析方法呢?

滗析有两个主要目的&#xff0c;一种是去除陈年或未经过滤的葡萄酒中的沉淀物。虽然沉淀物不会对你造成任何伤害&#xff0c;但当喝葡萄酒满嘴都是葡萄沉淀物时是一件很糟糕的事。其次&#xff0c;倾析葡萄酒是可以让葡萄酒“呼吸”与氧气接触的&#xff0c;氧气可以软化单宁&a…

二维数值型数组例题

1、单位矩阵初始化 题目描述 对用作单位矩阵的数组初始化。单位矩阵在主对角线上的值为1&#xff0c;而其他的地方的值为0&#xff0c;并且主对角线上的行、列下标是一样的。 输入要求 输入一个整数n表示矩阵的行数 输出要求 输出n*n的单位矩阵。数据之间以空格间隔&…

LeetCode Hot100 102.二叉树的层序遍历

题目&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 方法&#xff1a;迭代 class Solution {public List<List<Integer>> levelOrder(TreeNode root) {if …

C语言——输入一个4位正整数,输出其逆数。

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int i,j 0;int a1,a2,a3,a4;printf("输入一个4位正整数&#xff1a;\n");scanf("%d",&i);a1 i/1000; a2 i/100%10; a3 i/10%10; a4 i%10; printf("千位a1%d,百位a…

【JavaFx】利用JavaFx写一个登录页面

以下是一个基本的JavaFX登录页面示例: import javafx.application.Application; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.co…

mysql的alter怎么使用?

在MySQL中&#xff0c;ALTER语句用于修改数据库的表结构。下面是一些ALTER语句的示例用法&#xff1a; 1. 添加列&#xff1a; ALTER TABLE 表名 ADD 列名 数据类型; 2. 修改列的数据类型&#xff1a; ALTER TABLE 表名 MODIFY 列名 新数据类型; 3. 修…

新人工作方法论:高效率的工作

引言&#xff1a; 转眼间入职半载&#xff0c;在工作期间曾迷茫、困惑&#xff0c;深深的感受到职场身份的转变带来的痛苦。痛苦的原因不仅仅包括学生时代自己闷头做事的思维习惯与团队合作需求的差异性&#xff0c;也包括缺乏体系的工作方法。 自己在网络上查了一些方法论&a…

80C51单片机----数据传送类指令

目录 一.一般传送指令&#xff0c;即mov指令 1.16位传送&#xff08;仅1条&#xff09; 2.8位传送 &#xff08;1&#xff09;目的字节为A&#xff08;累加器&#xff09; &#xff08;2&#xff09;目的字节为Rn(工作寄存器) &#xff08;3&#xff09;目的字节为direct…