将联表查询到的数据按1000一批次存入数据库-模板

idea模板:


/**
 * ${Shitilei}信息 服务层实现。
 *
 * @author admin
 */
@Service
@RequiredArgsConstructor
public class Operate${Shitilei}Service {

    private final ${Shitilei}Mapper ${shitilei}Mapper;
    private final RegionUtil util;

    /**
     * ${shitilei}表
     * @return 操作结果
     */
    @Transactional
    public Long create${Shitilei}(){
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        Integer count=0;//统计成功插入数据多少条
        Integer fhCount=0;//符合条件的一共多少条

        Map<Integer,Integer> dqMap=new LinkedHashMap<>();//排查错误用 存所有批次成功多少条
        Integer dqCount=0;//上个批次成功多少条 排查错误用
        Integer number=1;//批次逐个增加

        String objStr="/";//字符串为空时默认
        Double objDouble=-1d;//小数为空时默认
        int objInt=-1;//整数为空时默认
        String objDate="1900-01-01 00:00:00";//日期为空时默认

        int finalNumber=1000;//固定 1000条

        //符合条件的sql
        //sql不允许有;号 只允许有一条联表大sql
        String property = System.getProperty("user.dir")+"/file/"+"${shitilei}.sql";
        String sql = util.readSqlFile(property);

        //计算总条数的sql
        String sqlCount="select count(0) from ("+sql+") t";
        Long countByQuery = Db.selectCount(sqlCount);
        int countSize =countByQuery.intValue();//符合条件的总数
        int startCount = 0;//开始索引
        int jCount = 1;//第几页
        while (countSize>0) {//有值才进来循环遍历
            int endCount = finalNumber;
            startCount = (jCount - 1) * endCount;//当前起始
            //分页 当前批次从第几条到第几条
            String dqSql=sql+" limit "+startCount+","+endCount;//当前批次的sql语句
            //当前批次 材料表数据
            List<Row> rows = Db.selectListBySql(dqSql);
            List<${Shitilei}Ao> infos = RowUtil.toEntityList(rows, ${Shitilei}Ao.class);
            //符合条件的收件信息表数据
            fhCount += infos.size();//符合条件的总数
            List<${Shitilei}> list = new ArrayList<>();//存放当前批次的数据
            for (${Shitilei}Ao pojo : infos) {//逐个赋值
                ${Shitilei} entity=new ${Shitilei}();
                
                
                   
                list.add(entity);
            }

            if (number > 1) {
                dqCount = count;//上一个批次成功条数
            }
            count += ${shitilei}Mapper.insertBatch(list, list.size());//这个批次最多1000一个
            list.clear();//不当前这批次的都添加完再清空 继续下一个批次数据添加
            int i = count - dqCount;
            dqMap.put(number, i);//存起来方便查看 当前第几批次/当前批次成功多少条
            dqCount = 0;//重置
            number++;//更新批次号

            jCount++;//更新页数
            countSize -= finalNumber;//下一页 是否继续循环
        }

        if(!count.equals(fhCount)){
            Set<Integer> keys = dqMap.keySet();
            for (Integer key : keys) {
                System.out.println("第"+key+"批次:成功插入"+dqMap.get(key)+"条");
            }
            throw new RuntimeException("插入数据与符合条件的个数不一致(符合条件的个数:"+fhCount+"条,成功插入的个数:"+count+"条)");
        }
        return count.longValue();
    }


}

读取.sql文件里sql语句的工具类并拼接成string字符串类型返回:


import cn.hutool.core.util.StrUtil;
import org.springframework.stereotype.Component;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;

@Component
public class RegionUtil {


    /**
     * 面积单位转换
     * @param area 面积
     * @param fromUnit 传入面积单位 "0001"平方米、"0002"亩、"0003"公顷、"0004"平方千米(默认"0001"平方米)
     * @param toUnit 输出面积单位 "0001"平方米、"0002"亩、"0003"公顷、"0004"平方千米
     * @return 转换后面积
     */
    public BigDecimal convertArea(BigDecimal area, String fromUnit, String toUnit) {
        if(area==null||fromUnit.equals(toUnit)) {
            return area;
        }
        if (StrUtil.isBlank(fromUnit)) {
            fromUnit = "0001";
        }

        // 将所有单位转换为平方米
        double area1 = area.doubleValue();
        double squareMeters ;
        switch (fromUnit) {
            case "0004": //平方千米
                squareMeters = area1 * 1000000;
                break;
            case "0003": //公顷
                squareMeters = area1 * 10000;
                break;
            case "0002": //亩
                squareMeters = area1 * 666.667;
                break;
            //case "0001": //平方米
            default://平方米
                squareMeters = area1;
        }

        // 将平方米转换为目标单位
        double convertedArea ;
        switch (toUnit) {
            case "0001": //平方米
                convertedArea = squareMeters;
                break;
            case "0004": //平方千米
                convertedArea = squareMeters / 1000000;
                break;
            case "0003": //公顷
                convertedArea = squareMeters / 10000;
                break;
            case "0002": //亩
                convertedArea = squareMeters / 666.667;
                break;
            default:
                throw new RuntimeException("输出面积单位错误!");
        }
        return BigDecimal.valueOf(convertedArea).setScale(2, RoundingMode.HALF_UP);
    }

    /**
     * area 面积
     * fromUnit 面积单位
     * toUnit 把fromUnit面积单位转换成指定的面积单位
     * scale 保留小数点后几位
     * */
    public BigDecimal convertArea(BigDecimal area, String fromUnit, String toUnit,int scale) {
        if(area==null||fromUnit.equals(toUnit)) {
            return area;
        }
        if (StrUtil.isBlank(fromUnit)) {
            fromUnit = "0001";
        }

        // 将所有单位转换为平方米
        double area1 = area.doubleValue();
        double squareMeters ;
        switch (fromUnit) {
            case "0004": //平方千米
                squareMeters = area1 * 1000000;
                break;
            case "0003": //公顷
                squareMeters = area1 * 10000;
                break;
            case "0002": //亩
                squareMeters = area1 * 666.667;
                break;
            //case "0001": //平方米
            default://平方米
                squareMeters = area1;
        }

        // 将平方米转换为目标单位
        double convertedArea ;
        switch (toUnit) {
            case "0001": //平方米
                convertedArea = squareMeters;
                break;
            case "0004": //平方千米
                convertedArea = squareMeters / 1000000;
                break;
            case "0003": //公顷
                convertedArea = squareMeters / 10000;
                break;
            case "0002": //亩
                convertedArea = squareMeters / 666.667;
                break;
            default:
                throw new RuntimeException("输出面积单位错误!");
        }
        return BigDecimal.valueOf(convertedArea).setScale(scale, RoundingMode.HALF_UP);
    }

    /**
     * 金额单位转换
     * @param amount 金额
     * @param fromUnit 传入金额单位 "0001"元、"0002"万元(传入不在限定值或空默认元)
     * @param toUnit  输出金额单位 "0001"元、"0002"万元
     * @return 转换后金额
     */
    public BigDecimal convertAmount(BigDecimal amount, String fromUnit, String toUnit) {
        if(amount==null||fromUnit.equals(toUnit)) {
            return amount;
        }
        if (StrUtil.isBlank(fromUnit)) {
            fromUnit = "0001";
        }
        // 先将输入的金额统一转换为元
        double amount1 = amount.doubleValue();
        double yuan ;
        switch (fromUnit.toLowerCase()) {
            case "0002": // 万元
                yuan = amount1 * 10000;
                break;
            //case "0001": // 元
            default:// 元
                yuan = amount1;
        }

        // 根据目标金额单位进行转换
        double convertedAmount ;
        switch (toUnit.toLowerCase()) {
            case "0001": // 元
                convertedAmount = yuan;
                break;
            case "0002": // 万元
                convertedAmount = yuan / 10000;
                break;
            default:
                throw new RuntimeException("输出金额单位错误!");
        }

        return BigDecimal.valueOf(convertedAmount);
    }

    /**
     * amount 价格
     * fromUnit 价格单位
     * toUnit 把fromUnit价格单位转换成指定的价格单位
     * scale 保留小数点后几位
     * */
    public BigDecimal convertAmount(BigDecimal amount, String fromUnit, String toUnit,int scale) {
        if(amount==null||fromUnit.equals(toUnit)) {
            return amount;
        }
        if (StrUtil.isBlank(fromUnit)) {
            fromUnit = "0001";
        }
        // 先将输入的金额统一转换为元
        double amount1 = amount.doubleValue();
        double yuan ;
        switch (fromUnit.toLowerCase()) {
            case "0002": // 万元
                yuan = amount1 * 10000;
                break;
            //case "0001": // 元
            default:// 元
                yuan = amount1;
        }

        // 根据目标金额单位进行转换
        double convertedAmount ;
        switch (toUnit.toLowerCase()) {
            case "0001": // 元
                convertedAmount = yuan;
                break;
            case "0002": // 万元
                convertedAmount = yuan / 10000;
                break;
            default:
                throw new RuntimeException("输出金额单位错误!");
        }

        return BigDecimal.valueOf(convertedAmount).setScale(scale, RoundingMode.HALF_UP);
    }

    /**
     * 传入文件路径比如: D://test.sql  逐行读取sql语句然后拼接最终返回字符串
     * */
    public String readSqlFile(String path) {
        StringBuilder sb = new StringBuilder();

        try {
            File file = new File(path);
            BufferedReader br = new BufferedReader(new FileReader(file));
            String line;

            while ((line = br.readLine()) != null) {
                sb.append(line).append("\n");
            }

            br.close();
        } catch (IOException e) {
            throw new RuntimeException("报错了:"+e.getMessage());
        }

        return sb.toString();
    }
}

注意:sql语句结尾不要带;号 并且sql文件只能有一个联表大sql
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/636138.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决Ubuntu无法使用root登录的问题

1、登录普通用户 2、使用vi编辑器打开/etc/pam.d/gdm-autologin并注释掉auth required pam_succeed_if.so user ! root quiet_success 3、使用vi编辑器打开/etc/pam.d/gdm-password并注释掉auth required pam_succeed_if.so user ! root quiet_success 4、注销用户重新用roo…

【网络协议】【OSI】一次HTTP请求OSI工作过程详细解析

目录 1. 一次HTTP请求OSI工作过程 1.1 应用层&#xff08;第7层&#xff09; 1.2 表示层&#xff08;第6层&#xff09; 1.3 会话层&#xff08;第5层&#xff09; 1.4 传输层&#xff08;第4层&#xff09; 1.5 网络层&#xff08;第3层&#xff09; 1.6 数据链路层&am…

Z缓冲技术在AI去衣中的关键角色

引言&#xff1a; 人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;为图像处理领域带来了革命性的变化。其中&#xff0c;AI去衣技术作为一种新兴的应用&#xff0c;引起了广泛关注。它不仅在多媒体内容的编辑、虚拟现实和增强现实等领域具有重要的应用价值&…

Java八大类型详解

整数类型 (4种) 整数的类型 类型占用内存空间范围byte [字节]1字节-128 ~ 127存放的范围是>二进制short [短整型]2字节 -(2⁵) ~ 2⁵-1 -32768 ~ 32767 int [整形]4字节 -2 ~ 2-1 -2147483648 - 2147483647 long [长整形]8字节-2⁶ ~ 2⁶-1 整数类型的使用细节 1. Java个…

el-table 划入划出方法

<template><div><el-table :data"tableData" style"width: 100%" cell-mouse-enter"handleMouseEnter" cell-mouse-leave"handleMouseLeave"><el-table-column prop"ddd" label"日期2" widt…

Java 数组的基本使用

目录 含义语法格式语句特点数组的长度数组的元素打印数组显示数组数组的复制扩展示例【12】&#xff1a; 含义 数组&#xff08;array&#xff09;是一种最简单的复合数据类型&#xff0c;它是有序数据的集合&#xff0c;数组中的每个元素具有相同的数据类型&#xff0c;可以用…

Mysql基础教程(06):NOT IN

数据准备 首先创建一个数据库educational_manage&#xff0c;记住字符集和排序规则如下选择&#xff1a; 接着创建表和数据&#xff0c;具体的sql代码如下&#xff1a; SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure f…

JavaScript-隐式转换和显式转换

为什么需要类型转换&#xff1f; 因为JavaScript是弱类型声明&#xff0c;在没赋值前是不知道数据的类型的&#xff0c;只有赋值了才知道&#xff0c;表单和prompt获取的数据都是字符串型&#xff0c;此时就不能直接的简单加减法运算 所以需要转换数据类型 隐式转换 某些运算符…

Xcode=> 安装 simulator

XCode xcode中下载 simulator 点击加号➕&#xff0c;选择对应的版本&#xff0c;即可下载 下载完成&#xff1a; 其他下载办法 因为使用上述下载&#xff0c;会经常性的出现断开&#xff0c;再次下载又是从头开始&#xff0c;太费时费力。下面使用下载地址&#xff0c;然后用…

仓库管理WMS软件(Warehouse Management Software)百科解析

一、什么是仓库管理软件&#xff08;WMS&#xff09;&#xff1f; 仓库管理软件&#xff08;WMS&#xff09;全称Warehouse Management System&#xff0c;是一种专门用于仓库作业流程优化和库存控制的软件系统。它通过先进的自动识别与数据采集技术&#xff0c;实现对仓库货物…

人工智能(Educoder)-- 机器学习 -- 神经网络(初级)

第一关 注&#xff1a; 神经网络的起源和应用 起源&#xff1a;神经网络最早由心理学家和神经学家开创&#xff0c;目的是模拟生物神经系统对真实世界物体的交互反应。应用&#xff1a;现代神经网络用于分类&#xff08;如图像识别、文本分类&#xff09;和数值预测&#xff08…

全球手游4月战报,《Monopoly GO!》荣耀再续!全球手游畅销榜冠军

易采游戏网5月22日消息&#xff0c;在刚刚过去的四月里&#xff0c;全球移动游戏市场的角逐愈发激烈。根据最新发布的数据&#xff0c;Scopely旗下的经典游戏《Monopoly GO!》再次蝉联全球手游畅销榜首冠军宝座&#xff0c;展现了无与伦比的市场魅力与玩家黏度。 4月Scopely《M…

Docker | 基础指令

环境&#xff1a;centos8 参考&#xff1a; 安装 Docker | Docker 从入门到实践https://vuepress.mirror.docker-practice.com/install/ 安装Docker 卸载旧版本&#xff0c;安装依赖包&#xff0c;添加yum软件源&#xff0c;更新 yum 软件源缓存&#xff0c;安装 docker-ce…

Neural Filters:风景混合器

Ps菜单&#xff1a;滤镜/Neural Filters/创意/风景混合器 Neural Filters/CREATIVE/Landscape Mixer 风景混合器 Landscape Mixer滤镜通过与另一个图像混合或改变诸如时间和季节等属性&#xff0c;神奇地改变景观。 “风景混合器”滤镜利用人工智能和机器学习技术&#xff0c;首…

使用Prometheus + Blackbox-exporter快速监控一个网站性能和SSL过期时间

使用blackbox-exporter快速监控一个网站性能和SSL过期时间 环境介绍什么是blackbox-exporter下载blackbox-exporter安装blackbox-exporter配置Prometheus服务端查看job上线监控面板参考文献 环境介绍 本文实验环境 操作系统&#xff1a;Centos 7.9Prometheus版本&#xff1a;…

局部直方图均衡化去雾算法

目录 1. 引言 2. 算法流程 3. 代码 4. 去雾效果 1. 引言 局部直方图算法是一种基于块的图像去雾方法&#xff0c;它将图像分割为若干个块&#xff0c;并在每个块内计算块的局部直方图。通过对各个块的直方图进行分析和处理&#xff0c;该算法能够更好地适应图像中不同区域的…

软件测评在项目中的作用

软件测评在项目中的作用至关重要&#xff0c;主要体现在以下几个方面&#xff1a; 确保软件质量&#xff1a;软件测评是确保软件质量的关键环节。通过对软件的功能、性能、安全性等方面进行全面测试&#xff0c;可以发现软件中的缺陷、错误或不符合需求的地方&#xff0c;从而…

使用OpenVINO™.CSharp.API.Extensions.PaddleOCR NuGet Package快速实现OCR文本识别

PP-OCR是PaddleOCR自研的实用的超轻量OCR系统&#xff0c;可以实现端到端的图像文本检测。为了在C#平台实现使用OpenVINO™部署PP-OCR模型实现文本识别&#xff0c;让更多开发者快速上手PP-OCR项目&#xff0c;基于此&#xff0c;封装了OpenVINO.CSharp.API.Extensions.PaddleO…

selenium环境安装和web自动化基础

webUI自动化背景 因为web页面经常会变化&#xff0c;所以UI自动化测试的维护成本很高。不如接口的适用面广&#xff0c;所以大部分公司会做接口自动化测试&#xff0c;但是未必会做UI自动化测试&#xff1b; UI自动化测试要做也是覆盖冒烟测试&#xff0c;不会到很高的覆盖率&a…

mysql实战——xtrabackup问题

备份恢复后启动不成功。 我测试了很多遍&#xff0c;最开始我以为备份后的数据文件没有pid造成的&#xff0c;所以一直测试 后来发现上图这样是正常的&#xff0c;mysqld_safe后就出现pid和sock文件 那启动失败的原因我认为是权限的问题&#xff0c;把数据文件目录权限全部设置…