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 ...
随机推荐
- Linux 下权限的管理
Linux 下权限的管理 我们都知道,Linux系统对于用户的权限管理是十分严格的. 那么,我们就来具体了解一下. 一. 用户 在Linux中按照类型用户分为两种:1.超级用户 2.普通用户 那么它们 ...
- 大一C语言学习笔记(6)---自省篇--流程控制;break,continue,return间的异同;数组应用到循环语句中需要注意的问题;++i 和 i++的异同等。
下面是傻瓜博主"曾经"犯过的错和一些心得: ༼ つ ◕_◕ ༽つ 1.要想流程控制学好,一定要学会化繁为简,举栗子: 三目运算符 (略?略:略)---就是一个数字嘛, ...
- 第三周PTA笔记 回文数+A-B(大数减法)+高精度除法+数楼梯(大数加法)
回文数 对于一个自然数n,若将n的各位数字反向排列所得的数n1与n相等,则称n为回文数,例如2332. 若给定一个N( 2<=N<=16)进制数M(M的长度在一百位以内),如果M不是回文数 ...
- 接口返回图片,前端生成临时url实现展示、下载效果
请求一个后端接口 返回一张图片(打印后发现是二进制流) 瞬间不开心了(为什么不能后端处理好再让前端调用呢) 不过丝毫不慌好吧 先说处理逻辑:首先要将获取到的数据转换,这边选择以blob形式进行转换 主 ...
- Error filterStart
一般原因为:1.xml配置失误filter应配置在servlet-mapping前面(应该都知道吧).看看class配的 别找不到.2.filter中某段代码未实例化(这个情况是出现最多的,要仔细检查 ...
- [atAGC050A]AtCoder Jumper
考虑二叉树的结构,但并不容易构造从叶子返回的边 (以下为了方便,将所有点编号为$[0,n)$) 对于$i$,选择$2i\ mod\ n$和$(2i+1)\ mod\ n$这两条出边 从二叉树的角度并不 ...
- Study Blazor .NET(一)简介
翻译自:Study Blazor .NET,转载请注明. 介绍 Blazor是一个全新的 Web UI 框架,它使用c# .Razor 和 HTML以及 WebAssembly W3C标准.它提供了用 ...
- 多线程02.继承Thread类
package chapter2; /** * 1.使用static虽然完成了当前的功能. * 但是static的生命周期比较长,需要在所有线程执行完成后才会结束. * 还有号没有按照顺序进行打印 * ...
- git新手配置(ios环境)
ios环境,初步了解git是个什么东西,使用过svn相关软件最佳,否则可以先补一下git的相关概念和用处,相关教程:https://www.liaoxuefeng.com/wiki/896043488 ...
- 力扣 - 剑指 Offer 47. 礼物的最大价值
题目 剑指 Offer 47. 礼物的最大价值 思路1 因为是要求最大价值,而且只能移动下方或者右方,因此,每个位置的最大值就是本身的值加上上边 / 左边 中的最大值,然后每次遍历都可以复用上一次的值 ...