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 ns 5. IPC Namespace 详解
文章目录 1. 简介 2. 源码分析 2.1 copy_ipcs() 2.2 ipcget() 2.3 ipc_check_perms() 2.4 相关系统调用 参考文档: 1. 简介 进程间通讯的机 ...
- hive 权限排查
show grant role role_username id username
- SVN错误:Attempted to lock an already-locked dir svn: Working copy locked
VN错误:Attempted to lock an already-locked dir update D:/workspace20/SC_200/metadata -r 3398 --force ...
- ThreadPoolExecutor里面4种拒绝策略(详细)
ThreadPoolExecutor类实现了ExecutorService接口和Executor接口,可以设置线程池corePoolSize,最大线程池大小,AliveTime,拒绝策略等.常用构造方 ...
- part 36 AngularJS route reload
In this video we will discuss angular route service reload() method. This method is useful when you ...
- python3排序 sorted(key=lambda)--实现对字典按value值排序
使用python对列表(list)进行排序,说简单也简单,说复杂也复杂,我一开始学的时候也搞不懂在说什么,只能搜索一些英文文章看看讲解,现在积累了一些经验,写在这里跟大家分享, 1.sorted函数首 ...
- 『学了就忘』Linux软件包管理 — 47、Linux源码包的安装和卸载
目录 1.源码包安装服务的注意事项 2.源码包安装服务的过程 3.源码包安装服务的删除 4.源码包安装服务的启动 5.源码包安装服务的关闭 1.源码包安装服务的注意事项 (1)安装服务选择哪种软件包? ...
- 猿猿有责,维持整洁的 Git 提交记录,三个锦囊送给你
背景 大家都有学习如何规范简洁的编写代码,但却很少学习如何规范简洁的提交代码.现在大家基本上都用 Git 作为源码管理的工具,Git 提供了极大的灵活性,我们按照各种 workflow 来提交/合并 ...
- [noi34]palindrome
分割实际上就是不断地从两端取出一样的一段,并对剩下的串进行分割.下面我们来证明一下每一次贪心取出最短一段的正确性: 考虑两种分割方式,分别表示成S=A+B+A和S=C+D+C,其中A就是最短的一段,那 ...
- java及python调用RabbitMQ
1,python调用MQ发送消息(生产者),话不多说,直接上干货 import pika 如下图 2.java调用MQ发送消息(生产者) 具体代码如下: python 的代码如下 connection ...