Java代码批量处理sql语句

news2024/11/15 1:50:03

背景:数据源迁移,目标数据源和原始数据源的语法不同,要把建表语句全都改成新的语法。
一个个sql文件去替换实在是麻烦,可以把原始的sql文件放在一个文件夹,然后用程序一跑,改完语法的sql语句就放在新的文件夹里了。

主要用到的File文件操作,一行一行解析;
还有比较巧妙的是用到了String.format()方法,%s作为占位符,会被替换成后面跟着的参数。

package com.test;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;

import java.io.File;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
public class SqlTransTest {

    public static void main(String[] args) throws Exception {
        long start = System.currentTimeMillis();
        File srcDir = new File("C:\\Users\\humeng\\Desktop\\ori");
        File targetDir = new File("C:\\Users\\humeng\\Desktop\\out");
        File[] files = srcDir.listFiles();
        if (!ArrayUtils.isEmpty(files)) {
            for (File file : files) {
                if (file.isHidden()) {
                    continue;
                }
                List<String> out = new ArrayList<>();
                List<String> append = new ArrayList<>();
                AtomicReference<String> tableName = new AtomicReference<>();
                List<String> lines = FileUtils.readLines(file, Charset.defaultCharset());
                lines.forEach(line -> {
                    if (StringUtils.isBlank(line) || "(".equals(line) || ")".equals(line)) {
                        out.add(line);
                        return;
                    }
                    if (line.startsWith("CREATE TABLE ")) {
                        String tableNameStr = line.replace("CREATE TABLE ", "");
                        tableNameStr = String.format("dim.%s", tableNameStr.substring(tableNameStr.indexOf(".") + 1));


                        if (tableNameStr.contains(" COMMENT ")) {
                            String[] tableInfos = tableNameStr.split(" COMMENT ");
                            tableNameStr = tableInfos[0];
                            append.add(String.format("COMMENT ON TABLE %s IS %s;", tableNameStr, tableInfos[1]));
                        }
                        tableName.set(tableNameStr);
                        out.add(String.format("CREATE TABLE %s", tableName.get()));
                        return;
                    }
                    if (line.toUpperCase().startsWith("PARTITIONED BY ")) {
                        System.out.println("发现分区语句:"+file.getName()+"===>"+line);
                        // todo 分区转换
                        return;
                    }
                    String endChar = line.endsWith(",") ? "," : "";
                    String[] columnInfos = line.replace("  ", " ").replace(" ,", ",").split(" ");
                    out.add(columnInfos[0] + " " + tranType(columnInfos[1], file.getName()) + endChar);

                    if (columnInfos.length > 2) {
                        if (!StringUtils.equalsIgnoreCase("comment", columnInfos[2])) {
                            System.out.println("发现未知语句:"+file.getName()+"===>"+line);
                            // todo 看下sql是否存在异常,针对性修改sql或补充转换处理
                            return;
                        }
                        String[] columnSections = line.split(String.format(" %s ", columnInfos[2]));
                        if (columnSections.length > 2) {
                            System.out.println("sql异常,发现单行多comment语句:"+file.getName()+"===>"+line);
                            // todo 看下sql是否存在异常,针对性修改sql或补充转换处理
                            return;
                        }

                        String commentStr = columnSections[1];
                        if (commentStr.endsWith(",")) {
                            commentStr = commentStr.substring(0, commentStr.length() - 1);
                        }
                        append.add(String.format("COMMENT ON COLUMN %s.%s IS %s;", tableName.get(), columnInfos[0], commentStr));
                    }
                });
                out.add("");
                out.add("TABLESPACE ctg169519944208");
                out.add("DISTRIBUTED RANDOMLY");
                out.add("");
                out.addAll(append);

                FileUtils.writeLines(new File(targetDir, file.getName()), out);
                System.out.println("文件写入完成====>" + file.getName());
            }
        }

        long end = System.currentTimeMillis();
        System.out.println("全部文件写入完成,耗时" + (end - start) + "毫秒");
    }

    private static String tranType(String typeStr, String fileName) {
        if (typeStr.endsWith(",")) {
            typeStr = typeStr.substring(0, typeStr.length() - 1);
        }
        if (typeStr.toUpperCase().startsWith("VARCHAR") || typeStr.toUpperCase().startsWith("INT")) {
            return typeStr;
        }
        if (typeStr.toUpperCase().startsWith("NUMBER")) {
            return  "NUMERIC(36,18)";
        }
        if (typeStr.equalsIgnoreCase("LONG")) {
            return  "BIGINT";
        }
        if (typeStr.equalsIgnoreCase("DOUBLE")) {
            return  "DOUBLE PRECISION";
        }
        System.out.println("发现未知类型:"+ typeStr + "===>" + fileName);
        return typeStr;
    }

}

append就是后面追加的部分,这里全都是coment语句。
效果如图:
在这里插入图片描述

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

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

相关文章

口袋奇兵游戏攻略:云手机辅助战锤入侵策略指南!

在《口袋奇兵》中&#xff0c;战锤入侵是一个重要的游戏环节&#xff0c;了解如何有效地参与战锤入侵能够帮助玩家获取更多的资源和提升自己的战力。本文将详细介绍战锤入侵的策略和技巧&#xff0c;帮助玩家在战锤入侵活动中取得更好的成绩。除了找到强力的游戏辅助&#xff0…

miniconda+xinference的大模型推理部署指南

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 基于Dify的智能分类方案&#xff1a;大模型结合KNN算法&#xff08;附代码&#xff…

【视觉SLAM】 十四讲ch5习题

1.*寻找一个相机&#xff08;你手机或笔记本的摄像头即可&#xff09;&#xff0c;标定它的内参。你可能会用到标定板&#xff0c;或者自己打印一张标定用的棋盘格。 参考我之前写过的这篇博客&#xff1a;【OpenCV】 相机标定 calibrateCamera Code来源是《学习OpenCV3》18.…

喜报!CACTER实力入选《嘶吼2024网络安全产业图谱》多项领域

CACTER实力入选多项细分领域 7月16日&#xff0c;嘶吼安全产业研究院正式发布《嘶吼2024网络安全产业图谱》&#xff0c;旨在全面展示网络安全产业的构成及其重要组成部分&#xff0c;探索网络安全产业的竞争格局和发展前景。 CACTER凭借卓越的技术实力和可靠的产品服务&#…

[论文笔记] Pai-megatron-patch cpu-offload 改到 Qwen2

Add MPI Support for tp-comm-overlap and Cpu-Offload for Mcore Distrib… by jerryli1981 Pull Request #283 alibaba/Pai-Megatron-Patch GitHub 以上是在 llama-70B 上实现的 cpu-offload 方法。 下面是在主分支上&#xff0c;仿照 LLaMA-70B&#xff0c;在 Qwen2 上…

手把手教你搭建Docker私有仓库Harbor

1、什么是Docker私有仓库 Docker私有仓库是用于存储和管理Docker镜像的私有存储库。Docker默认会有一个公共的仓库Docker Hub&#xff0c;而与Docker Hub不同&#xff0c;私有仓库是受限访问的&#xff0c;只有授权用户才能够上传、下载和管理其中的镜像。这种私有仓库可以部署…

HarmonyOS工程目录结构

应用级配置文件app.json5 应用唯一标识、版本号、应用图标、应用名称等信息 模块级配置文件module.json5 oh-package.json5 三方库的管理 其他配置 用于编译构建&#xff0c;包括构建配置文件、编译构建任务脚本、混淆规则文件、依赖的共享包信息等。 build-profile.json…

Java学习Day9之数据库链接java

package aboutdb1; import java.sql.*; import java.util.Scanner; public class newDBsystem {private static Connection getConnection() throws Exception {Class.forName("com.mysql.cj.jdbc.Driver"); // 加载MySQL JDBC驱动Connection con DriverManager.get…

阿尔泰科技工业电脑IPC-8363工控机

概述&#xff1a; IPC-8363是一款支持 LGA 1200 Intel 10th/11th Generation Core™ i9/i7/i5/i3, Celeron and Pentium processor 的工业电脑。配置2组独立 SO-DIMM DDR4 2666/2933MHz内存&#xff0c;最大可扩展至128GB。 主要技术指标&#xff1a; 产品图示&#xff1a; 系…

php 小白新手从入门到精通教程(第3版)

前言 PHP&#xff08;PHP: Hypertext Preprocessor&#xff09;即“超文本预处理器”&#xff0c;是在服务器端执行的脚本语言&#xff0c;尤其适用于Web开发并可嵌入HTML中。PHP语法学习了C语言&#xff0c;吸纳Java和Perl多个语言的特色发展出自己的特色语法&#xff0c;并根…

qt初入门8:下拉框,输入框模糊查询,提示简单了解 (借助QCompleter)

实现一个简单的模糊查询的逻辑&#xff0c;输入框能提示相关项。 主要借助qt的QCompleter 类&#xff08; Qt 框架中提供的一个用于自动补全和模糊搜索的类&#xff09;&#xff0c;结合一些控件&#xff0c;比如QComboBox和QLineEdit&#xff0c;实现模糊查询的功能。 1&…

在线实习项目|泰迪智能科技企业级项目学习,暑期大数据人工智能学习

在线实习介绍 实习时间&#xff1a;每个项目周期七周左右 面向对象&#xff1a;大数据、计算机相关专业学生&#xff1b;大三、大四毕业年度学生 在线实习收获 1、获得项目实战技能&#xff0c;积累项目经验 2、获得在线实习证明 项目特点…

能源化工5G防爆终端能给行业带来什么重要作用?

在能源化工领域&#xff0c;5G防爆终端的引入无疑为行业带来了革命性的变革与重要作用。这些集成了先进5G通信技术和防爆设计的高端设备&#xff0c;不仅提升了生产作业的安全性&#xff0c;还极大地增强了运营效率与智能化水平。 高速、低延迟的5G网络为防爆终端提供了前所未有…

安全防御2

实验要求&#xff1a; 实验过程&#xff1a; 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换)&#xff1a; 新建电信区&#xff1a; 新建移动区&#xff1a; 将对应接口划归到各自区域&#xff1a; 新建…

Java(二十二)---队列

文章目录 前言1.队列(Queue)的概念2.Queue的使用3.队列的模拟实现4.循环队列5.双端队列6.面试题[1. 用队列实现栈](https://leetcode.cn/problems/implement-stack-using-queues/description/)[2. 用栈实现队列](https://leetcode.cn/problems/implement-queue-using-stacks/de…

VPN以及GRE和MGRE

VPN VPN — 是虚拟专用网络 通俗地说&#xff0c;就是通过虚拟的手段&#xff0c;将两个独立的网络&#xff0c;穿越一个公共网络进行连接&#xff0c;实现点到点专线的效果&#xff08;可以理解为&#xff1a;一个分公司通过公网和总公司建立点到点的专线连接&#xff09; 现…

innovus:如何获取clock net的route_type和clock name

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 clock net的route type分为top trunk和leaf,net_type的设置方式见文章:

【06】LLaMA-Factory微调大模型——微调模型评估

上文【05】LLaMA-Factory微调大模型——初尝微调模型&#xff0c;对LLama-3与Qwen-2进行了指令微调&#xff0c;本文则介绍如何对微调后的模型进行评估分析。 一、部署微调后的LLama-3模型 激活虚拟环境&#xff0c;打开LLaMA-Factory的webui页面 conda activate GLM cd LLa…

汇编实验5

本实验在32位Linux虚拟机中完成&#xff08;点击查看安装教程&#xff09; 实验内容 二进制炸弹实际是由C语言源程序生成的可执行目标代码&#xff0c;主程序可参考bomb.c。运行时&#xff0c;会按次序提示用户输入3个不同的字符串。如果输入的字符串有误&#xff0c;炸弹就会…

结合金融场景的Scipy模块编程

结合金融场景的Scipy模块编程 数据链接&#xff1a;https://pan.baidu.com/s/1VMh8-4IeCUYXB9p3rL45qw 提取码&#xff1a;c6ys import numpy as np import pandas as pd import statsmodels import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams[font.sans-se…