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 ...
随机推荐
- Uncaught (in promise) Error: Request failed with status code 500解决方案
今天又学到一种修改bug的方法 : let newpwd = crypto.createHash('md5').update(req.body.upwd).digest('hex'); 在点击按钮加 ...
- 【数据结构&算法】11-树基础&二叉树遍历
目录 前言 树的定义 树的存储结构 双亲表示法 孩子表示法 孩子兄弟表示法 二叉树 定义 特点 形态 特殊二叉树 斜树 满二叉树 完全二叉树 二叉树的性质 二叉树的存储结构 二叉树的顺序存储结构 二叉 ...
- mysql 存储ipv6
自定义列 https://groups.google.com/g/sqlalchemy/c/lZw0GipVYFw https://docs.sqlalchemy.org/en/14/core/cus ...
- 第一周PTA笔记 德州扑克题解
德州扑克 最近,阿夸迷于德州扑克.所以她找到了很多人和她一起玩.由于人数众多,阿夸必须更改游戏规则: 所有扑克牌均只看数字,不计花色. 每张卡的值为1.2.3.4.5.6.7.8.9.10.11.12 ...
- 暑假算法练习Day5
咕咕了好几天哈哈哈哈,因为这几天在忙一些其他事(bushi ,好吧其实就是自己太懒啦,从今天开始继续每天的算法练习 1010 一元多项式求导 (25 分) 设计函数求一元多项式的导数.(注:\(x^n ...
- Mac下Shell脚本使用学习笔记(一)
参考文献 Shell 教程 MAC常用终端命令行 Mac下Shell脚本使用 1.使用终端创建test.sh: (1)进入指定文件夹路径(命令示例:cd Desktop/面向对象程序设计): (2)创 ...
- cmd 命令 导出导入oracle数据库 的 表
原地址:https://www.cnblogs.com/mysterious-killer/p/11671741.html (防止) 导出: 不要数据的:exp username/pwd@localh ...
- Nginx server_name翻译
http://nginx.org/en/docs/http/server_names.html#regex_names 匹配优先顺序 精确名称,无通配符,无正则. 以星号开头的最长的通配符名称,例如& ...
- 通过python来获取网页状态
#!/usr/bin/python import sys,httplibfrom optparse import OptionParserusageString = "Usage: %pro ...
- 14-2-Unsupervised Learning ----Word Embedding
Introduction 词嵌入(word embedding)是降维算法(Dimension Reduction)的典型应用 那如何用vector来表示一个word呢? 1-of-N Encodin ...