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

news2024/9/20 1:02:07

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
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【抽代复习笔记】18-置换练习题(2)及两个重要定理

最近一直忙于学校的事情&#xff0c;好久没更新了&#xff0c;实在抱歉。接下来几期大概也会更得慢一些&#xff0c;望见谅。 练习4&#xff1a;写出4次对称群S4中所有置换。 解&#xff1a;由上一篇笔记结尾的定理我们知道&#xff0c;4次对称群的阶&#xff08;也就是所含元…

SAP-有历史业务情况下的物料批次切换前提条件和方案建议

转载自&#xff1a;SAP-有历史业务情况下的物料批次切换前提条件和方案建议 - 知乎 (zhihu.com) 在SAP中&#xff0c;物料是否启用批次管理主要是通过物料上的“批次管理”字段进行控制&#xff0c;但物料批次管理涉及库存很多业务节点的控制&#xff0c;因此一旦有业务的发生&…

超市生鲜如何持续盈利?

生鲜经营是现代超市功能配置中不可缺少的组成部分&#xff0c;通过生鲜区经营及其效果可以反映出超市业态发展的成熟化程度。做好了可以达到集客和盈利的目的&#xff0c;做得不好&#xff0c;也很容易成为超市中的亏损&#xff0c;更难指望顾客经常光顾。 超市生鲜区生存和发展…

QT creator centralwidget前面有个禁止符号

centralwidget前面有个禁止符号&#xff1a;表示分拆布局 在主窗口空白处&#xff0c;右键&#xff0c;选择布局即可选择不同的布局方式&#xff0c;表示对窗口内所有控件部件进行布局&#xff0c;不如垂直布局。

Android模块化项目搭建和模块之间跳转传值(2)

一、前言 这是一篇关于Android模块化的项目搭建和配置&#xff0c;没有看过我第一部分的同学如果不清楚整个流程的&#xff0c;可以回头看一下&#xff0c;有利于你更加快速的掌握和使用。 二、引入ARouter 模块化顾名思义就是将项目按模块的方式进行开发&#xff0c;加大了…

C++小病毒

C小病毒&#xff08;注&#xff1a;对电脑无过大伤害&#xff09; 短短行&#xff0c;创造奇迹&#xff01; 把这个文件命名为virus.exe就可以使用了。 #include<bits/stdc.h> #include<windows.h> using namespace std; int main() {HWND hwnd GetForegroundW…

一图看懂 | 蓝卓新材料行业解决方案

小到芯片、手机、智能手表&#xff0c;大到智能装备、新能源汽车、光伏电池板&#xff0c;新材料的运用不可缺少。作为未来产业的“基石”&#xff0c;新材料行业有力支撑了航空航天、电子信息、新能源等战略性新兴产业的发展壮大。 七大行业特点&#xff0c;五大应用场景&…

【WEEK13】 【DAY3】Shiro第三部分【中文版】

2024.5.22 Wednesday 接上文【WEEK13】 【DAY2】Shiro第二部分【中文版】 目录 15.4.登录拦截15.4.1.修改ShiroConfig.java15.4.2.新建login.html页面15.4.3.修改MyController.java15.4.4.再次修改ShiroConfig.java15.4.5.重启 15.5.用户认证15.5.1.修改MyController.java15.5.…

【css】引入背景图时候,路径写入@会报错

看报错信息 我的写法 解决办法 在前面加个~

个体因果效应估计|EDVAE:用于个体治疗效果估计的反事实推理中的解开潜在因素模型

【摘要】根据观察数据估计个体治疗效果&#xff08;ITE&#xff09;是一项至关重要但具有挑战性的任务。解缠结表示已用于将代理变量分为混杂变量、工具变量和调整变量。然而&#xff0c;根据观测数据准确地进行反事实推理来识别 ITE 仍然是一个悬而未决的问题。在本文中&#…

6. Spring面试题汇总

Java全栈面试题汇总目录-CSDN博客 1. 什么是Spring框架? Spring是一种轻量级开发框架&#xff0c;旨在提高开发人员的开发效率以及系统的可维护性。 我们一般说Spring框架指的都是Spring Framework&#xff0c;它是很多模块的集合&#xff0c;使用这些模块可以很方便地协助…

每周打靶VulnHub靶机-LOOZ_ 1

Looz: 1 靶机传送门 Not that hard and not that easy, it’s always straightforward if you can imagine it inside your mind. 没有那么难也没有那么容易&#xff0c;只要你能在脑海中想象出来&#xff0c;它总是很简单的 1.信息搜集 使用nmap进行域内存活主机扫描发现targ…

A10 vThunder镜像-eveng pnetlab镜像下载

A10 vThunder 是由 A10 Networks 发布的。A10 Networks 是一家专注于应用交付控制器&#xff08;ADC&#xff09;、负载均衡、安全和基于云的应用交付解决方案的公司。A10 vThunder 系列产品包括虚拟应用交付控制器&#xff08;ADC&#xff09;和其他虚拟化网络功能&#xff0c…

html 段落与排版标记 Web前端开发技术、详细文章(例如)

段落与排版标记 网页的外观是否美观&#xff0c;很大程度上取决于其排版。在页面中出现大段的文字&#xff0c;通常采用分段进行规划&#xff0c;对换行也有极其严格的划分。本节从段落的细节设置入手&#xff0c;利用段落与排版标记自如地处理大段的文字。 段落p标记 在HTM…

展厅设计对企业有哪些作用

1、增强品牌形象 企业展厅对于增强企业品牌形象、提升企业的知名度和市场竞争力具有显著作用和意义。展厅作为企业对外的窗口&#xff0c;是客户和访客了解企业的第一印象。通过独特的设计风格和精心的展示布局&#xff0c;企业可以将自身的核心价值和文化理念巧妙地融入到展厅…

ip地址怎么改成自己想要的地区

在数字化时代&#xff0c;IP地址不仅代表着我们在网络世界中的身份标识&#xff0c;更是与地理位置紧密相连的要素。然而&#xff0c;有时出于隐私保护、网络优化或特定访问需求&#xff0c;我们可能希望更改IP地址至心仪的地区。本文将为您详细介绍如何实现这一目标。 IP地址通…

Mac安装 Intellij IDEA,亲测有效M1、M2可用

引言 最近开始学习使用spring boot写一个简单的后端项目&#xff0c;使用Intellij IDEA软件&#xff0c;Intellij IDEA为新用户提供了30天的免费试用。 方案 1.官网下载Intellij IDEA IntelliJ IDEA – the Leading Java and Kotlin IDE 或者直接网盘连接下载&#xff1a;…

轻松驾驭文件重命名,一键批量导出位置与名称至表格,让文件管理更高效便捷!

无论是工作还是生活&#xff0c;我们都需要与各种各样的文件打交道。有时&#xff0c;为了快速查找或整理文件&#xff0c;我们可能需要记录它们的位置和名称。但面对海量的文件&#xff0c;手动记录不仅耗时耗力&#xff0c;还容易出错。那么&#xff0c;有没有一种方法能够轻…

ES6中的Map和WeakMap你能分清吗?这里教会你

Map和WeakMap都是ES6中新增的数据结构&#xff0c;用于存储键值对。他们之间有什么区别&#xff0c;本文给大家详细讲述下&#xff0c;并附上示例代码。 一、什么是Map和WeakMap&#xff1f; 在JavaScript中&#xff0c;Map和WeakMap都是用来存储键值对的数据结构。 Map是一…

vue.js对接海康威视摄像头web开发包

一、登录海康开放平台下载web开发包&#xff0c;下载需要先登录海康账号&#xff0c;没有的需先注册一个。 这里的appkey、ip、port、secret 和cameraIndexCodeasd是自己去申请的 appkey: "****", ip: "****", port: **, secret: "****", //必填…