SpringBoot+MybatisPlus实现批量添加的两种方式
第一种:
因为Mysql数据每次发送sql语句的长度不能超过1M,所以,每次发送insert语句以固定长度发送:
将sql语句在provider中,以固定长度装入List集合中,然后返回service层,调用mapp,发送sql语句
//provider类
public class sql {
private List <String> sqlList = new ArrayList<>(); private void makeUpSql(StringBuilder sql, StringBuilder paramSql2) {
sqlList.add(sql.append(paramSql2.substring(0, paramSql2.length()-1)).toString());
} @SuppressWarnings("unchecked")
public List<String> batchInsert(Map<String, Object> map) throws Exception {
List<IBean> beans = (List<IBean>) map.get("list");
int length = Numbers.parseInt(map.get("length"));
Class<?> bclz = beans.get(0).getClass();
StringBuilder sql = batchInsertBeforeSql(beans);
int sizeBefore = sql.toString().getBytes().length; StringBuilder paramSql2 = new StringBuilder(); for (IBean bean : beans) {
int sizeSql1 = paramSql2.toString().getBytes().length+sizeBefore;
StringBuilder paramSql2c = new StringBuilder(paramSql2.toString());
paramSql2.append("(");
for(Field f : bclz.getDeclaredFields()) {
f.setAccessible(true);
if (!Modifier.isStatic(f.getModifiers())) {// 非静态资源
String fname = f.getName();
if("id".equals(fname) ) {
continue;
}
String value = Strings.of(f.get(bean)).replaceAll("\"", "\\\\\"");
value = value.replaceAll("\'", "\\\\\'");
paramSql2.append("\"").append(value).append("\", ");
}
}
paramSql2 = new StringBuilder(paramSql2.substring(0, paramSql2.length()-2));
paramSql2.append("),");
if(sizeSql1<length && paramSql2.toString().getBytes().length+sizeBefore>=length) {
makeUpSql(sql,paramSql2c);
Map<String, Object> map1 = new HashMap<>();
List<IBean> nextList = beans.subList(beans.indexOf(bean), beans.size());
map1.put("list", nextList);
map1.put("length", length);
return batchInsert(map1);
}
} sqlList.add(sql.append(paramSql2.substring(0, paramSql2.length()-1)).toString());
return sqlList;
} public StringBuilder batchInsertBeforeSql(List<IBean> beans) {
StringBuilder sql = new StringBuilder("insert into ");
Class<?> bclz = beans.get(0).getClass();
sql.append(bclz.getSimpleName().toLowerCase()).append(" ("); StringBuilder paramSql = new StringBuilder();
for(Field f : bclz.getDeclaredFields()) {
f.setAccessible(true);
if (!Modifier.isStatic(f.getModifiers())) {// 非静态资源
String fname = f.getName();
if("id".equals(fname) ) {
continue;
}
paramSql.append(",").append(fname);
}
}
return sql.append(paramSql.substring(1)).append(") values ");
} //service层
public void sendSql(List<String> listSql) {
for (String sql : listSql) {
Mapper.batchInsert3(sql); }
//mapper层
@Insert("${sql}")
int batchInsert3(@Param("sql") String sql);
第二种:
创建一个session,将每条insert语句单条调用mapper,使用session统一commit
//若指定有多个数据源,需要添加注解@Qualifier,指明使用哪个数据库的SqlSessionTemplate
@Qualifier("kwSqlSessionTemplate")
@Autowired
private SqlSessionTemplate sqlSessionTemplate; public void batchInsert(List<Issue> beanList) {
SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH,false);
IssueMapper mapper = session.getMapper(IssueMapper.class);
try {
for (int i = 0;i<beanList.size();i++) {
mapper.insert(beanList.get(i));
if(i%1000==999 || i==beanList.size()-1) {
session.commit();
session.clearCache();
}
}
}catch(Exception e) {
e.printStackTrace();
session.rollback();
}finally {
session.close();
}
}
SpringBoot+MybatisPlus实现批量添加的两种方式的更多相关文章
- mysql批量更新的两种方式效率试验<二>
Mysql两种批量更新的对比 简介: mysql搭载mybits框架批量更新有两种方式,一种是在xml中循环整个update语句,中间以‘:’隔开,还有一种是使用case when 变相实现批量更新, ...
- mybatis批量保存的两种方式(高效插入)
知识点:mybatis中,批量保存的两种方式 1.使用mybatis foreach标签 2.mybatis ExecutorType.BATCH 参考博客:https://www.jb51.net/ ...
- mybatis中批量插入的两种方式(高效插入)
MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用 ...
- 基于Maven的SpringBoot项目实现热部署的两种方式
转载:http://blog.csdn.net/tengxing007/article/details/72675168 前言 JRebel是JavaEE中比较流行的热部署插件,可快速实现热部署,节省 ...
- 在springboot中使用Mybatis Generator的两种方式
介绍 Mybatis Generator(MBG)是Mybatis的一个代码生成工具.MBG解决了对数据库操作有最大影响的一些CRUD操作,很大程度上提升开发效率.如果需要联合查询仍然需要手写sql. ...
- springboot mybatis使注解和xml两种方式同时生效
声明:该博客参考了:https://www.jianshu.com/p/53762ac6d31c 如果上面这个博客中的内容已经解决了你的问题,那就不用往下看了,如何按照上面的配置一直报这个异常: or ...
- MyBatis_动态sql_foreach_mysql下foreach批量插入的两种方式
方法1: 笔记要点出错分析与总结工程组织数据库组织0.重新修改Bean类 修改1.定义接口 //批量插入 public void addEmps(@Param("emps") ...
- 引入springboot的两种方式以及springboot容器的引入
一.在项目中引入springboot有两种方式: 1.引入spring-boot-starter-parent 要覆盖parent自带的jar的版本号有两种方式: (1)在pom中重新引入这个jar, ...
- SpringBoot整合Servlet的两种方式
SpringBoot整合Servlet有两种方式: 1.通过注解扫描完成Servlet组件的注册: 2.通过方法完成Servlet组件的注册: 现在简单记录一下两种方式的实现 1.通过注解扫描完成Se ...
随机推荐
- 实验1:SDN拓扑拓扑实验
一.实验目的 能够使用源码安装Mininet: 能够使用Mininet的可视化工具生成拓扑: 能够使用Mininet的命令行生成特定拓扑: 能够使用Mininet交互界面管理SDN拓扑: 能够使用Py ...
- sql关联修改
UPDATE p set p.ClientID = c.id from PaymentTable p left JOIN ClientTable c on p.ClientID = c.Clie ...
- FZU ICPC 2020 寒假训练 6 —— 字符串处理
P1603 斯诺登的密码 题目描述 2013年X月X日,俄罗斯办理了斯诺登的护照,于是他混迹于一架开往委内瑞拉的飞机.但是,这件事情太不周密了,因为FBI的间谍早已获悉他的具体位置--但这不是最重要的 ...
- 用js实现web端录屏
用js实现web端录屏 原创2021-11-14 09:30·无意义的路过 随着互联网技术飞速发展,网页录屏技术已趋于成熟.例如可将录屏技术运用到在线考试中,实现远程监考.屏幕共享以及录屏等:而在我们 ...
- .Net Core微服务——Ocelot(3):超时、熔断、限流
基本概念 超时.熔断.限流听起来好像很远,但实际上用在方方面面.很多人可能还搞不懂熔断是做什么,其实可以把熔断理解为一种防护措施.做个假设,在微服务体系下,某个下游服务响应很慢,然后随着时间推移,会有 ...
- python 函数的定义及调用语法,map 方法,函数嵌套递归
1.什么是函数 开发程序时候,需要代码执行多次,为了提高编写效率及代码重用性,所以把具有独立功能的代码块组织为一个小模块,给这个功能一个名称,这就是函数. 函数可以使用系统自带的函数也可以 ...
- [luogu1390]公约数的和
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 2000005 4 long long n,ans,f[N],vi ...
- Ubuntu压缩和解压缩
1.常用的压缩格式 tar tar.bz2 tar.gz 2.gzip压缩 gzip xxx //压缩 gzip -d xxx.gz //解压缩 gzip对文件夹的压缩 gzip -r xxx //文 ...
- 【Java面试题】-- Java基本类型
Java基本类型 2019-11-03 19:03:48 by冲冲 1.两个float型相减丢失精度,如何解决? 使用BigDemical装饰器模式 public class Test { pub ...
- Sentry 监控 - Snuba 数据中台架构(编写和测试 Snuba 查询)
系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...