首页 > 其他分享 >处理新老科目修改类问题--工具类

处理新老科目修改类问题--工具类

时间:2025-01-06 17:34:38浏览次数:9  
标签:编码 String -- tableConfig fieldToUpdate 新老 字段名 conn 科目

解决的问题

对于很对财税的业务系统,修改新老科目比较麻烦。
因为报表里面配置了很多公式,里面写了很多老科目,如果一个个手工替换,会耗时较久。
我的思路是通过程序来跑这个功能。下面用科目编码来举例。如何修改。

准备工作

1.首先要有一个新老科目的对照表:

老科目新科目
660205140166021011

2.根据新老科目对照表建一个数据库表:

– 创建B表,包含原编码和新编码的对照关系

CREATE TABLE B (
    b1 VARCHAR(255) PRIMARY KEY, -- 原编码
    b2 VARCHAR(255)              -- 新编码
);

– 插入示例数据到B表

INSERT INTO B (b1, b2) VALUES
('6602051401', '66021011'),
('6602040101', '66020901');

关于excel数据可以用根据直接导入数据库,或者可以手工拼接一个insert语句。
拼接语句的链接可以参考如下:
https://blog.csdn.net/qq_42985657/article/details/129079141

我之前的链接写了一个update的,把语法调整一下就可以了。

准备工作总结:

1.现在数据库中有一个需要更新数据的业务表A的a1列(a1列就是要修改的列),以及a2列(a2列就是表A的唯一标识字段或者是组合唯一标识字段)。
2.一个表B来存储新老科目的对照关系,b1是原编码,b2是新编码。

代码编写

思路

遍历A表的每一行,并使用字符串函数来精确定位和替换原编码。下面的代码中数据库链接方式,以及6个参数要根据实际情况来编写。

代码

import java.sql.*;
import java.util.*;

public class CodeUpdater {

    // 封装数据库连接信息
    private static class DBConfig {
        String url;
        String username;
        String password;

        DBConfig(String url, String username, String password) {
            this.url = url;
            this.username = username;
            this.password = password;
        }
    }

    // 封装表及字段信息
    private static class TableConfig {
        String sourceTable;
        String fieldToUpdate;
        String uniqueIdentifier;
        String mappingTable;
        String mappingFieldOldCode;
        String mappingFieldNewCode;

        TableConfig(String sourceTable, String fieldToUpdate, String uniqueIdentifier,
                    String mappingTable, String mappingFieldOldCode, String mappingFieldNewCode) {
            this.sourceTable = sourceTable;
            this.fieldToUpdate = fieldToUpdate;
            this.uniqueIdentifier = uniqueIdentifier;
            this.mappingTable = mappingTable;
            this.mappingFieldOldCode = mappingFieldOldCode;
            this.mappingFieldNewCode = mappingFieldNewCode;
        }
    }

    // 更新编码的核心逻辑方法
    private static void updateCodes(Connection conn, TableConfig tableConfig) throws SQLException {
        Map<String, String> codeMap = loadCodeMap(conn, tableConfig);
        updateSourceTable(conn, tableConfig, codeMap);
    }

    // 从映射表中加载编码映射关系
    private static Map<String, String> loadCodeMap(Connection conn, TableConfig tableConfig) throws SQLException {
        Map<String, String> codeMap = new HashMap<>();
        String sql = "SELECT " + tableConfig.mappingFieldOldCode + ", " + tableConfig.mappingFieldNewCode +
                     " FROM " + tableConfig.mappingTable;
        try (PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery()) {
            while (rs.next()) {
                codeMap.put(rs.getString(tableConfig.mappingFieldOldCode), rs.getString(tableConfig.mappingFieldNewCode));
            }
        }
        return codeMap;
    }

    // 更新源表中的编码
    private static void updateSourceTable(Connection conn, TableConfig tableConfig, Map<String, String> codeMap) throws SQLException {
        conn.setAutoCommit(false); // 开启事务
        String sqlSelect = "SELECT " + tableConfig.uniqueIdentifier + ", " + tableConfig.fieldToUpdate +
                           " FROM " + tableConfig.sourceTable;
        String sqlUpdate = "UPDATE " + tableConfig.sourceTable + " SET " + tableConfig.fieldToUpdate + " = ? WHERE " +
                           tableConfig.uniqueIdentifier + " = ?";

        try (PreparedStatement pstmtSelect = conn.prepareStatement(sqlSelect);
             ResultSet rs = pstmtSelect.executeQuery();
             PreparedStatement pstmtUpdate = conn.prepareStatement(sqlUpdate)) {

            while (rs.next()) {
                String id = rs.getString(tableConfig.uniqueIdentifier);
                String originalString = rs.getString(tableConfig.fieldToUpdate);

                // 替换编码
                for (Map.Entry<String, String> entry : codeMap.entrySet()) {
                    if (originalString != null && originalString.contains(entry.getKey())) {
                        originalString = originalString.replace(entry.getKey(), entry.getValue());
                    }
                }

                // 更新记录
                pstmtUpdate.setString(1, originalString);
                pstmtUpdate.setString(2, id);
                pstmtUpdate.executeUpdate();
            }
            conn.commit(); // 提交事务
        } catch (SQLException e) {
            conn.rollback(); // 发生异常时回滚事务
            throw e; // 重新抛出异常以便上层处理
        }
    }

    // 主方法,用于启动更新流程
    public static void main(String[] args) {
       // 示例命令行参数
String[] exampleArgs = {
    "employees",      // sourceTable: 源数据表名
    "department",     // fieldToUpdate: 需要更新的字段名
    "employee_id",    // uniqueIdentifier: 用于唯一标识记录的字段名
    "dept_mapping",   // mappingTable: 映射表名,用于查找旧代码对应的新代码
    "old_dept_code",  // mappingFieldOldCode: 映射表中存储旧代码的字段名
    "new_dept_code"   // mappingFieldNewCode: 映射表中存储新代码的字段名
};
 
// 检查参数数量(虽然这里使用示例参数,但通常在实际应用中仍需检查)
// if (args.length != 6) {
//     System.out.println("Usage: java CodeUpdater <sourceTable> <fieldToUpdate> <uniqueIdentifier> <mappingTable> <mappingFieldOldCode> <mappingFieldNewCode>");
//     return;
// }
 
// 解析命令行参数(这里使用示例参数进行演示)
TableConfig tableConfig = new TableConfig(
    exampleArgs[0], // 源数据表名
    exampleArgs[1], // 需要更新的字段名
    exampleArgs[2], // 用于唯一标识记录的字段名
    exampleArgs[3], // 映射表名,用于查找旧代码对应的新代码
    exampleArgs[4], // 映射表中存储旧代码的字段名
    exampleArgs[5]  // 映射表中存储新代码的字段名
);

        // 数据库连接配置
        DBConfig dbConfig = new DBConfig(
                "jdbc:mysql://localhost:3306/your_database_name", "your_database_username", "your_database_password"
        );

        Connection conn = null;
        try {
            // 建立数据库连接
            conn = DriverManager.getConnection(dbConfig.url, dbConfig.username, dbConfig.password);
            // 调用核心逻辑方法更新编码
            updateCodes(conn, tableConfig);
            System.out.println("编码替换完成。");
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 关闭数据库连接
            if (conn != null) {
                try { conn.close(); } catch (SQLException e) { e.printStackTrace(); }
            }
        }
    }
}

标签:编码,String,--,tableConfig,fieldToUpdate,新老,字段名,conn,科目
From: https://blog.csdn.net/qq_42985657/article/details/144966908

相关文章

  • builder.Services.AddCors()
    在ASP.NETCore中,使用builder.Services.AddCors()方法可以配置跨源资源共享(CORS)策略。CORS是一种安全机制,用于允许一个域上的网页请求另一个域上的资源。默认情况下,浏览器会阻止跨源请求,因此需要通过配置CORS来允许这些请求。配置CORS的基本步骤以下是如何在ASP.NETC......
  • 黄药师药业管理软件 UploadFile实例 任意文件写入致RCE漏洞复现(附脚本)
    0x01产品描述:        ‌黄药师药业管理软件‌是一款针对我国医药或医疗器械企业经营管理特点而设计的综合管理软件。它集进销存、财务、经营分析和GSP管理为一体,能够系统地管理企业的资金流、物流和信息流。该软件采用“一看就懂,一学就会,一用就灵”的开发理念,人机界......
  • Foxit PDF SDK 10.1 for Windows (C++ Library)
    FoxitPDFSDKforWindows强大且易于使用的核心API,用于渲染、查看、注释、签名、保护和管理PDF中的表单。快速集成功能强大且易于使用的C++、C#、C、Python和Java核心API。系统要求:WindowsXP、Vista、7、8和10(32位和64位);WindowsServer2003、2008、2012和......
  • Linux内核的固定映射:提升性能的秘密武器
    在当今数字化时代,高效稳定的Linux内核是众多技术应用的基石。你是否好奇,如何让Linux内核在复杂任务中实现卓越性能?今天,我们要揭开其提升性能的秘密武器——固定映射。它就像一位默默发力的幕后英雄,通过独特的机制,优化内核内存访问,让系统运行如丝般顺滑。下面,让我们一同走......
  • 无人设备遥控器之失步跳频算法篇
       无人设备遥控器的失步跳频算法,通常指的是在遥控器与无人设备通信过程中,当遇到通信失步(即通信不同步)或干扰时,采用的一种跳频技术来恢复或保持通信的稳定性和可靠性。一、跳频技术的基本原理   跳频技术(Frequency-HoppingSpreadSpectrum,FHSS)是一种无线通信技......
  • 中考英语优秀范文-010 The Spring Festival 春节
    1写作要求近年来我国的发展世人瞩目,中国的传统文化正越来越受到各国朋友的关注。请根据提示,以“TheSpringFestival”为题写一篇短文,向外国朋友介绍我国的春节。要求:1、字迹工整,规范;2、80词左右。2优秀范文TheSpringFestivalInChina,theSpringfestivalisthe......
  • HackMyVM-Alive靶机的测试报告
    目录一、测试环境1、系统环境2、使用工具/软件二、测试目的三、操作过程1、信息搜集2、Getshell3、主机探索/opt目录/vat/www/code的web渗透4、提权写入webshellUDF提权四、结论一、测试环境1、系统环境渗透机:kali2021.1(192.168.101.127)靶 机:debian(19......
  • FANUC机器人M-410iB/700电机断轴维修方法
    发那科(FANUC)作为电机领域的领袖品牌,其伺服电机广泛应用于各种工业设备中,特别是在机床、自动化控制、机器人等领域。然而,即使是如此高品质的伺服电机,也难免会出现FANUC工业机械手电机故障,其中断轴故障是比较常见的一种。一、法兰克机械手电机断轴故障原因分析1.机械过载:当机器人......
  • 穷举vs暴搜vs深搜vs回溯vs剪枝系列一>组合总和
     题目:方法一:解析:  代码: privateList<List<Integer>>ret;privateList<Integer>path;privateintaim;publicList<List<Integer>>combinationSum(int[]candidates,inttarget){aim=target;re......
  • (存储过程)定时任务实现及优化流程
    1.验证目标SQL逻辑在开发定时任务之前,先验证目标SQL的正确性,确保逻辑无误:•在开发环境或测试环境中运行目标SQL。•检查结果是否符合预期,包括字段、数据量和执行时间。示例:SELECTcolumn1,column2,column3FROMsource_tableWHEREconditions;2.创建数据目......