批量保存数据

2023-11-07

批量保存


    /**
     * 批量保存,参数为对象集合<br>
     * 条件:对象属性与数据库字段完全对应,允许使用大骆驼拼写法
     * <br> 2018年4月28日下午5:30:53
     * @throws Exception 
     */
    private String insert00000(List<Serializable> list, String tableName){

        StringBuilder sb = new StringBuilder();  
        sb.append("INSERT INTO " + tableName);  
        sb.append("(company_name,telephone,address,types,update_time) ");
        sb.append("VALUES ");  

        MessageFormat mf = new MessageFormat(
                "("
                + "#'{'list[{0}].companyName},"
                + "#'{'list[{0}].telephone},"
                + "#'{'list[{0}].address},"
                + "#'{'list[{0}].types},"
                + "#'{'list[{0}].updateTime}"
                + ")");  
        int listSize = list.size();
        for (int i = 0; i < listSize; i++) {
            sb.append(mf.format(new Object[]{i}));
            if (i < listSize - 1) {  
                sb.append(",");  
            }  
        }
        return sb.toString();
    }

========================================================================

​package com.lyb.serviceimpl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.lyb.dao.BatchExecuteDAO;

/**
 * 
 * @author lyb
 * 2019年11月7日 下午3:20:19
 */
@Service
public class BatchExecuteServiceImpl {
    

    @Autowired
    private BatchExecuteDAO batchExecuteDAO;
    
    /**
     * 批量保存
     * @param list  对象集合
     * @param tableName  数据库表名
     * @return
     */
    public  <T> Integer batchSaveList( List<T> list, String tableName){
        
        
        //每次保存的数据量;listInsert的容量。最大 999
        int size = 400; 

        //将原集合的数据分出一部分到该集合中进行保存
        List<T> listInsert = null;
        
        int result = 0; //统计插入记录总数
        //循环保存size数量的数据
        int listSize = list.size();
        while(listSize > size ){
            listInsert = list.subList(0, size);
            
            //调用保存数据的 DAO 
            int result1 = batchExecuteDAO.insert(listInsert, tableName);
            
            result += result1;
            //原集合数据更新为未保存的数据
            list = list.subList(size, list.size());
            listSize = list.size();
        }

        //保存最后剩下的,数量不足size的。并累计保存结果
        int result2 = batchExecuteDAO.insert(list, tableName);
        
        result += result2;
        return result;
        
    }
    

}
package com.lyb.dao;

import java.util.List;

import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import com.lyb.provider.BatchExecuteProvider;

/**
 * 批量操数据库的工具
 * @author lyb
 * 2019年11月7日 下午3:19:01
 */
@Mapper
public interface BatchExecuteDAO {

    /**
     * 批量保存数据
     * @param list 数据集合
     * @param tableName 数据库表名
     * @return 保存记录数
     */
    @InsertProvider(type = BatchExecuteProvider.class, method = "insert")
    <T> Integer insert(@Param("list")List<T> list, @Param("tableName")String tableName);
    
    
}
package com.lyb.provider;

import java.text.MessageFormat;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.ibatis.annotations.Param;
import org.springframework.core.env.Environment;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.serializer.SerializerFeature;

/**
 * 批量保存数据<br>
 * 一次最多保存999条<br>
 * 条件:对象属性与数据库字段完全对应,允许使用大骆驼拼写法
 * @author lyb
 * 2019年10月29日 下午3:32:43
 */
public class BatchExecuteProvider {
    
    /** 获取properties 配置文件 */
    private static  Environment env;  
    
    /**
     *  通过该构造器为env 赋值
     */
    public BatchExecuteProvider(Environment environment) {
        BatchExecuteProvider.env = environment;
    }
    /**
     * DAO 中使用该构造器创建对象
     */
    public BatchExecuteProvider() {}
    
    /**
     * 批量保存,参数为对象集合<br>
     * 一次最多保存999条数据
     * 条件:对象属性与数据库字段完全对应,允许使用大骆驼拼写法
     * <br> 2018年4月28日下午5:30:53
     * @throws Exception 
     */
    @SuppressWarnings("rawtypes")
    public <T> String insert(@Param("list") List<T> list, @Param("tableName")String tableName) throws Exception{
        
        if(list == null || list.size() == 0 ){
            return null;
        }
        if(tableName == null || tableName.trim().length() == 0){
            throw new Exception("tableName 不能为空");
        }

        //判定是否使用了帕斯卡命名法
        boolean camelCase = false; //默认没有使用帕斯卡
        String named = env.getProperty("mybatis.configuration.map-underscore-to-camel-case");
        if(named != null) {
            named = named.trim();
            if("true".equalsIgnoreCase(named)){
                camelCase = true;
            }
        }

        //将对象集转为Map集
        String strJsonArray = JSONArray.toJSONString(list, SerializerFeature.WriteMapNullValue);
        List<Map> listMap = JSONArray.parseArray(strJsonArray, Map.class);
        if(listMap == null || listMap.size() == 0){
            throw new Exception("数据为空");
        }
        
        //拼接sql 
        Map m0 = null;
        for (int i = 0; i < listMap.size(); i++) {
            m0 = listMap.get(i);
            if(m0 != null && !m0.isEmpty()){
                break;
            }
        }
        if(m0 == null ){
            throw new Exception("数据为空");
        }
        
        StringBuilder sql = new StringBuilder(); //SQL语句
        StringBuilder propertyName = new StringBuilder(); //对象的属性名称
        
        sql.append("INSERT INTO "+tableName+" (");
        
        Set set0 = m0.keySet();
        Object[] keyArray = set0.toArray(); 
        
        //组合数据库字段名 、 占位符
        for (int i = 0; i < keyArray.length; i++) {
            String key = (String) keyArray[i];
            if(camelCase && key.matches(".*[A-Z]+.*")){ //使用帕斯卡并且包含大写字母
                String newKey = CamelCaseToUnderline(key); //帕斯卡转下划线
                sql.append(newKey+",");
            }else{   //没有用帕斯卡,也包含大写?:字段名不区分大小写
                sql.append(key+",");
            }
            propertyName.append("#'{'list[{0}]."+key+"},");
        }
        //去掉最后一个逗号
        sql.deleteCharAt(sql.length()-1);
        propertyName.deleteCharAt(propertyName.length()-1);
        
        sql.append(") VALUES ");
        
        String values = "(" + propertyName.toString() + ")";

        MessageFormat mf = new MessageFormat(values);  
        int listSize = list.size();
        for (int i = 0; i < listSize; i++) {
            sql.append(mf.format(new Object[]{i}));
            if (i < listSize - 1) {  
                sql.append(",");  
            }  
        }
        return sql.toString();
    }


    /**
     * 大骆驼拼写法转为 下划线写法
     * <br> 2018年4月28日下午3:00:29
     */
    private String  CamelCaseToUnderline(String str){
        StringBuilder sb = new StringBuilder();
        char[] ca = str.toCharArray();
        for (int j = 0; j < ca.length; j++) {
           char c = ca[j];
           if( Character.isUpperCase(c)){
               char nc = Character.toLowerCase(c);//转为小写
               sb.append("_"+nc);
           }else{
               sb.append(c);
           }
        }
        return sb.toString();
    }

}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

批量保存数据 的相关文章

  • Android 中的列表(特别是 RecyclerView 和 CardView)如何工作

    请原谅我问这个问题 但我是 Android 开发新手 尽管我正在尝试了解developer android com 网站上的基础知识 但大多数示例 即使他们说它们是为 Android Studio 构建的 尚未设置为使用 Gradle 因此
  • Oracle Java 教程 - 回答问题时可能出现错误

    我是 Java 新手 正在阅读 Oracle 教程 每个部分之后都有问题和答案 我不明白一个答案中的一句话 见下面的粗体线 来源是https docs oracle com javase tutorial java javaOO QandE
  • 如何在 Openfire 中使用 smack

    你好 我计划开发一个可以连接到 gtalk facebook 等的聊天客户端 我决定将 smack API 与 openfire 一起使用 但我需要很少的指导来了解如何将它与 openfire 服务器一起使用 openfire 是否提供了基
  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • Logback:SizeAndTimeBasedRollingPolicy 不遵守totalSizeCap

    我正在尝试以一种方式管理我的日志记录 一旦达到总累积大小限制或达到最大历史记录限制 我最旧的存档日志文件就会被删除 当使用SizeAndTimeBasedRollingPolicy在 Logback 1 1 7 中 滚动文件追加器将继续创建
  • 在 Struts 2 中传递 URL 参数而不使用查询字符串

    我想使用类似的 URL host ActionName 123 abc 而不是像这样传递查询字符串 host ActionName parm1 123 parm2 abc 我怎样才能在 Struts 2 中做到这一点 我按照下面的方法做了
  • 您建议使用哪种压缩(GZIP 是最流行的)servlet 过滤器?

    我正在寻找一个用于大容量网络应用程序的 GZIP servlet 过滤器 我不想使用容器特定的选项 要求 能够压缩响应负载 XML Faster 已在大批量应用的生产中得到验证 应适当设置适当内容编码 跨容器移植 可选择解压缩请求 谢谢 我
  • tomcat 7.0.50 java websocket 实现给出 404 错误

    我正在尝试使用 Java Websocket API 1 0 JSR 356 中指定的带注释端点在 tomcat 7 0 50 上实现 websocket 以下是我如何对其进行编码的简要步骤 1 使用 ServerEndpoint注解编写w
  • 如何检测图像是否像素化

    之前有人在 SO 上提出过这样的问题 在Python中检测像素化图像 https stackoverflow com questions 12942365 detecting a pixelated image in python还有关于q
  • 在 MongoDB 和 Apache Solr 之间同步数据的简单方法

    我最近开始使用 MongoDB 和 Apache Solr 我使用 MongoDB 作为数据存储 并且希望 Apache Solr 为我的数据创建索引 以实现应用程序中的搜索功能 经过一些研究 我发现 基本上有两种方法可以在 MongoDB
  • 如何通过注解用try-catch包装方法?

    如果应该在方法调用中忽略异常 则可以编写以下内容 public void addEntryIfPresent String key Dto dto try Map
  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • Eclipse - 安装新的 JRE (Java SE 8 1.8.0)

    我正在尝试安装 Java 8 到目前为止我所做的 安装最新版本的 Eclipse 下载并安装 Java SE 运行时环境 8http www oracle com technetwork java javase downloads jre8
  • Java:如何确定文件所在的驱动器类型?

    Java 是否有一种独立于平台的方法来检测文件所在的驱动器类型 基本上我有兴趣区分 硬盘 可移动驱动器 如 USB 记忆棒 和网络共享 JNI JNA 解决方案不会有帮助 可以假设 Java 7 您可以使用 Java 执行 cmd fsut
  • JAVA中遍历JSON数据

    我是 JSON 新手 我使用 HTTPUrlConnections 并在 JAVA 程序中获得一些响应 响应数据将类似于 data id 1 userId 1 name ABC modified 2014 12 04 created 201
  • Play.application() 的替代方案是什么

    我是 Play 框架的新手 我想读取conf文件夹中的一个文件 所以我用了Play application classloader getResources Data json nextElement getFile 但我知道 play P
  • 如何在Java中对对象数组进行字段级别排序以进行等级比较?

    In Java Class StudentProgress String Name String Grade CTOR goes here main class main method StudentProgress arrayofObje
  • 使用 Java https 上传到 Imgur v3 错误

    我目前正在尝试使用他们当前的 API v3 上传到 imgur 但是我不断收到错误 错误 javax net ssl SSLException 证书中的主机名不匹配 api imgur com imgur com OR imgur com
  • HttpClient请求设置属性问题

    我使用这个 HttpClient 库玩了一段时间 几周 我想以某种方式将属性设置为请求 不是参数而是属性 在我的 servlet 中 我想使用 Integer inte Integer request getAttribute obj 我不
  • 即使调整大小,如何获得屏幕的精确中间位置

    好的 这个问题有两部分 当我做一个JFrame 并在其上画一些东西 即使我将宽度设置为 400 并使其在一个项目击中它时 当然 允许项目宽度 它会反弹回来 但由于某种原因 它总是偏离屏幕约 10 个像素 有没有办法解决这个问题 或者我只需要

随机推荐

  • pthread_mutex_init线程互斥锁的使用

    pthread mutex init 头文件 include
  • Springboot项目中@JsonProperty不生效-如何处理呢?

    转自 Springboot项目中 JsonProperty不生效 如何处理呢 下文笔者讲述SpringBoot中 JsonProperty不生效的相关简介说明 首先笔者将讲述JsonProperty注解的功能简介说明 JsonPropert
  • googlecloud谷歌云的初学体会(1)

    googlecloud谷歌云入门 1 一 纯小白自述 二 云是个什么云 三 装一个软件 资源 服务 四 服务器 爷爷提供服务的电脑 五 PGSQL的安装 六 总结 一 纯小白自述 自己是个小白 仅仅懂得几句sql查询和编程的基础语法 云是啥
  • 第八十七题 UVa12166 Equilibrium Mobile

    A mobile is a type of kinetic sculpture constructed to take advantage of the principle of equilibrium It consists of a n
  • 傻瓜攻略(七)——MATLAB神经网络的保存和调用

    作为科研领域十分重要的计算工具 MATLAB在深度学习方面也一直与时俱进 每一个版本的更新都会引进许多新的机器学习和深度学习案例 下面介绍将训练好的网络进行保存的方法 当再次调用网络时 可以在前一次训练的基础上进一步训练或者直接处理新数据
  • NIPS 2017

    Attention is all you need Author Unit Google Brain Google Research University of Toronto Authors Ashish Vaswani Noam Sha
  • 什么副业可以月赚1万元?做什么副业可以月入上万?

    在当前经济形势下 对于一个普通上班族而言 指望工资生活 日子肯定是过得紧巴巴的 许多人想谋求一份副业收入很正常 那么 在当前社会上 有哪些副业项目 能一个月收入一万多呢 我这里给大家推荐几个 仅供用于调研参考 1 自媒体 也许很多人会说这个
  • 决策树详解(一)

    1 决策树的概念 决策树算法以树状结构表示数据分类的结果 每个决策点实现一个具有离散输出的测试函数 记为分支 决策树的元素有 根节点 非叶子节点 分支 叶节点四种元素 其代表的含义如下图所示 决策树的工作分为两个阶段 1 训练阶段 给定训练
  • 生成以太坊系地址

    代码解析 要首先生成一个新的钱包地址 我们需要导入go ethereum crypto包 该包提供用于生成随机私钥的GenerateKey方法 privateKey err crypto GenerateKey if err nil log
  • 再论KVM超量使用

    转载自 http www sohu com a 111248295 251444 KVM超量使用一直是热门话题 前段时间发的文章 群讨论 虚拟机能否使用32个CPU 又引去了群友的激烈讨论 本文为群友根据自己的经验总结投稿 感谢这位热心的群
  • 华为 ospf 报文及邻居状态有限机

    华为 IP 路由基础 ospf 报文及邻居状态有限机 ospf协议邻居建立 一 ospf的工作机制 建立邻居 发送数据库信息 计算出最短路径 hello报文 用来建立邻居和维护邻居 邻居发现 是自动发现邻居路由器 使用的组播的地址224 0
  • docker 安装

    前提 开发环境为虚拟机Ubuntu 16 04 更换国内镜像 虚拟机是刚刚安装的 需要先更换成国内镜像源 1 首先备份原始源文件 sudo cp etc apt sources list etc apt sources list bak 2
  • RS推荐系统-LSH最近邻查找+MiniHash

    什么是最近邻查找 在推荐系统中 主要分为召回跟排序两个阶段 召回阶段 基于用户画像及场景数据从海量的视频库 百万级别 中将相关度最高的资源检索出来 作为候选集 召回阶段可以通过 粗糙 的方式召回候选item 排序阶段 基于更加精细的特征对候
  • Aspose实现word、excel、ppt转pdf

    1 工具类 AsposeUtil Component Slf4j public class AsposeUtil private static final String WORD doc docx wps wpt txt private s
  • 布隆过滤器及其实现

    简介 Bloom Filter 是由布隆 Burton Howard Bloom 在1970年提出的 loom Filter是一种空间效率很高的随机数据结构 它实际上是由一个很长的二进制向量和一系列随机映射函数组成 布隆过滤器可以用于可以快
  • kubernetes高可用集群安装(二进制安装、v1.20.2版)

    1 前言 之前文章安装 kubernetes 集群 都是使用 kubeadm 安装 然鹅很多公司也采用二进制方式搭建集群 这篇文章主要讲解 如何采用二进制包来搭建完整的高可用集群 相比使用 kubeadm 搭建 二进制搭建要繁琐很多 需要自
  • 修复Unity空白报错问题

    修复Unity空白报错问题 在升级Unity Hub之后 偶然发现Console里有几行空白的报错 看不到任何信息 由于有报错 导致修改代码无法生效 尝试重启项目 重装Unity都完全没效果 而且就算新建一个空白项目 只要添加代码就会立刻报
  • Linux操作系统原理—内核网络协议栈

    前言 本文主要记录 Linux 内核网络协议栈的运行原理 数据报文的封装与分用 封装 当应用程序用 TCP 协议传送数据时 数据首先进入内核网络协议栈中 然后逐一通过 TCP IP 协议族的每层直到被当作一串比特流送入网络 对于每一层而言
  • CASE WHEN 及 SELECT CASE WHEN的用法

    Case具有两种格式 简单Case函数和Case搜索函数 简单Case函数 CASE sex WHEN 1 THEN 男 WHEN 2 THEN 女 ELSE 其他 END Case搜索函数 CASE WHEN sex 1 THEN 男 W
  • 批量保存数据

    批量保存 批量保存 参数为对象集合 br 条件 对象属性与数据库字段完全对应 允许使用大骆驼拼写法 br 2018年4月28日下午5 30 53 throws Exception private String insert00000 Lis