第一种:

  因为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实现批量添加的两种方式的更多相关文章

  1. mysql批量更新的两种方式效率试验<二>

    Mysql两种批量更新的对比 简介: mysql搭载mybits框架批量更新有两种方式,一种是在xml中循环整个update语句,中间以‘:’隔开,还有一种是使用case when 变相实现批量更新, ...

  2. mybatis批量保存的两种方式(高效插入)

    知识点:mybatis中,批量保存的两种方式 1.使用mybatis foreach标签 2.mybatis ExecutorType.BATCH 参考博客:https://www.jb51.net/ ...

  3. mybatis中批量插入的两种方式(高效插入)

    MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用 ...

  4. 基于Maven的SpringBoot项目实现热部署的两种方式

    转载:http://blog.csdn.net/tengxing007/article/details/72675168 前言 JRebel是JavaEE中比较流行的热部署插件,可快速实现热部署,节省 ...

  5. 在springboot中使用Mybatis Generator的两种方式

    介绍 Mybatis Generator(MBG)是Mybatis的一个代码生成工具.MBG解决了对数据库操作有最大影响的一些CRUD操作,很大程度上提升开发效率.如果需要联合查询仍然需要手写sql. ...

  6. springboot mybatis使注解和xml两种方式同时生效

    声明:该博客参考了:https://www.jianshu.com/p/53762ac6d31c 如果上面这个博客中的内容已经解决了你的问题,那就不用往下看了,如何按照上面的配置一直报这个异常: or ...

  7. MyBatis_动态sql_foreach_mysql下foreach批量插入的两种方式

    方法1: 笔记要点出错分析与总结工程组织数据库组织0.重新修改Bean类    修改1.定义接口 //批量插入 public void addEmps(@Param("emps") ...

  8. 引入springboot的两种方式以及springboot容器的引入

    一.在项目中引入springboot有两种方式: 1.引入spring-boot-starter-parent 要覆盖parent自带的jar的版本号有两种方式: (1)在pom中重新引入这个jar, ...

  9. SpringBoot整合Servlet的两种方式

    SpringBoot整合Servlet有两种方式: 1.通过注解扫描完成Servlet组件的注册: 2.通过方法完成Servlet组件的注册: 现在简单记录一下两种方式的实现 1.通过注解扫描完成Se ...

随机推荐

  1. SpringBoot 整合 Docker

    最近备忘录新加的东西倒是挺多的,但到了新环境水土不服没动力去整理笔记 1. Demo Project 首先准备一个简单的项目,用来部署到 Docker 主机上,并且能验证该项目是否成功运行 1.1 接 ...

  2. Unity——有限状态机FSM修改

    FSM状态机改 一.前言 FSM状态机初版 之前写过一版有限状态机,后来发现很多问题: 前一个版本是记录了当前的状态,切换状态时,要等下一帧状态机Update的时候才会调动上个状态的退出,总会有一帧的 ...

  3. Solon 1.5.67 发布,增加 GraalVm Native 支持

    Solon 已有120个生态扩展插件,此次更新主要为细节打磨: 添加 solon.extend.graalvm 插件,用于适配 graalvm native image 模式 从此,solon 进入 ...

  4. LOTO示波器实测——光照强度传感器

    loto最近推出了很多的周边传感器模块的实测案例,本文介绍和演示LOTO示波器实测光照强度传感器的使用. 下图就是主角感光模块,可以用来测量光照强度. 这个模块也很简单,只有3个引脚,一个电源,3.3 ...

  5. [gym102769L]Lost Temple

    考虑第$i$列的答案,即找到一个区间$[l,r]$,使得: 1.$l$和$r$要同奇偶,令$ans=\frac{r-l}{2}$,要求尽量大($ans+1$即为该列答案) 2.$\forall 0\l ...

  6. PaintHouse I

    ColorCostDP.hpp // // Created by Administrator on 2021/7/21. // #ifndef C__TEST01_COLORCOSTDP_HPP #d ...

  7. String和其他数据类型

    1.String类. 1.1.对String在内存存储方面的理解: 第一:字符串一旦创建不可变. 第二:双引号括起来的字符串存储在字符串常量池中. 第三:字符串的比较必须使用equals方法. 第四: ...

  8. 关于"丢失的牛"这个题的教学反思

    某天上课讲到这样一个题:丢失的牛1~n,乱序排列,告诉从第二个位置到最后一个位置, 每个位置的前面的数字中比它小的数的个数,求每个位置的数字是多少N<=8000 FormatInput第一行给出 ...

  9. Atcoder Grand Contest 008 E - Next or Nextnext(乱搞+找性质)

    Atcoder 题面传送门 & 洛谷题面传送门 震惊,我竟然能独立切掉 AGC E 难度的思维题! hb:nb tea 一道 感觉此题就是找性质,找性质,再找性质( 首先看到排列有关的问题,我 ...

  10. Oracle——创建多个实例(数据库)、切换实例、登录数据库实例

    oracle中怎么创建多个实例? 其实很简单,怎么创建第一个实例,其他实例应该也怎么创建. 我的理解其实在linux中的oracle数据库中创建一个实例,实际上就是创建一个新的数据库,只是实例名字不同 ...