Java代码批量处理sql语句

背景:数据源迁移,目标数据源和原始数据源的语法不同,要把建表语句全都改成新的语法。
一个个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://xiahunao.cn/news/3248625.html

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

相关文章

基于Llama Index构建RAG应用

前言 Hello&#xff0c;大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者&#xff0c;本文参与活动是2024 DataWhale AI夏令营&#xff1b;&#x1f632; 在本文中作者将通过&#xff1a; Gradio、Streamlit和LlamaIndex介绍 LlamaIndex 构…

只用 CSS 能玩出什么花样?

在前端开发领域&#xff0c;CSS 不仅仅是一种样式语言&#xff0c;它更像是一位多才多艺的艺术家&#xff0c;能够创造出令人惊叹的视觉效果。本文将带你探索 CSS 的无限可能&#xff0c;从基本形状到动态动画&#xff0c;从几何艺术到仿生设计&#xff0c;只用 CSS 就能玩出令…

MySQL的索引、事务

MySQL的索引 索引的概念 索引是一个排序的列表&#xff0c;在列表当中存储索引的值以及索引值对应数据所在的物理行。 索引值和数据是一一映射的关系。 索引的作用 使用索引之后就不需要扫描全表来定位某行的数据 加快数据库查询的速度。 索引可以是表中的一列也可以是多…

WsgiDAV:强大的 WebDAV 解决方案

一、软件介绍 WsgiDAV 是一款卓越的开源 WebDAV 服务器和客户端库&#xff0c;由 Python 精心编写而成。它为用户搭建了一座通过 HTTP/HTTPS 协议访问和管理远程文件系统的便捷桥梁。 WsgiDAV 的核心是一个严格遵循 WebDAV 标准的中间件&#xff0c;能够与任何 WSGI 兼容的 W…

Python语法大全

#前言&#xff1a; 关于此篇博客主要是关于对Python语法的总结&#xff0c;有过C语言学习经历的人看的会更加通俗易懂&#xff01;&#xff08;当然没学过C的理解起来也是很容易&#xff09;知识点言简意赅&#xff0c;内容全面&#xff0c;多有代码解释&#xff01;且有多处实…

【数据结构】--- 栈和队列

前言 前面学习了数据结构的顺序表、单链表、双向循环链表这些结构&#xff1b;现在就来学习栈和队列&#xff0c;这里可以简单的说栈和队列是具有特殊化的线性表 一、栈 1.1、栈的概念和结构 栈是一种遵循先入后出逻辑的线性数据结构。 栈是一种特殊的线性表&#xff0c;它只允…

表格竖向展示

最近在做手机端web页面&#xff0c;页面中需要有个表格来显示数据&#xff0c;但是由于数据太多页面太窄&#xff0c;table展示横向滑动的话感觉很丑。所以让表格竖向显示了 具体页面如下: 实现代码&#xff1a;当然代码里面绑定的数据啊什么的你都可以修改为自己的内容&#…

PyTorch高级特性与性能优化

PyTorch高级特性与性能优化 引言&#xff1a; 在深度学习项目中&#xff0c;使用正确的工具和优化策略对于实现高效和有效的模型训练至关重要。PyTorch&#xff0c;作为一个流行的深度学习框架&#xff0c;提供了一系列的高级特性和性能优化方法&#xff0c;以帮助开发者充分利…

TDC 5.0:多集群统一纳管,构建一体化大数据云平台

近期&#xff0c;星环科技数据云平台Transwarp Data Cloud&#xff08;简称TDC&#xff09;5.0版本正式发布&#xff0c;TDC5.0架构屏蔽底层多个TDH集群的差异&#xff0c;采用统一操作模式&#xff0c;新增一个多集群抽象与管理层&#xff0c;能够实现多集群网络互通、跨集群资…

驱动框架——CMSIS第一部分 RTE驱动框架介绍

一、介绍CMISIS 什么是CMSIS&#xff08;cortex microcontrol software interface standard一种软件标准接口&#xff09;&#xff0c;官网地址&#xff1a;https://arm-software.github.io/CMSIS_6/latest/General/index.html 包含的core、driver、RTOS、dsp、nn等部分&…

【MySQL】11.使用 C 语言访问 MySQL

使用C语言访问MySQL 一.检查第三方库是否配置成功二.MySQL 常用接口1.创建&#xff0c;销毁操作句柄2.使用句柄连接数据库3.向 mysqld 发送指令4.查询相关函数 三.使用示例 一.检查第三方库是否配置成功 想要使用代码连接数据库&#xff0c;必须使用 MySQL 官方提供的第三方库。…

redis服务器同 redis 集群

搭建redis服务器 修改服务运行参数 常用命令常用命令 创建redis集群 准备做集群的主机&#xff0c;不允许存储数据、不允许设置连接密码 配置服务器&#xff1a; 1、在任意一台redis服务器上都可以执行创建集群的命令。 2、--cluster-replicas 1 给每个master服务器分配1台…

Java之反射和枚举及lambda表达式

1.反射 1 定义 Java 的反射&#xff08; reflflection &#xff09;机制是在 运行 状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的 所有属性和方法 &#xff1b;对于任 意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff0c;既然能拿到那么&…

链表面试练习习题(Java)

1. 思路&#xff1a; 创建两个链表&#xff0c;一个用来记录小于x的结点&#xff0c;一个用来记录大于等于x的结点&#xff0c;然后遍历完原链表后&#xff0c;将小于x的链表和大于等于x的链表进行拼接即可 public class Partition { public ListNode partition(ListNode pH…

【Java面向对象】抽象类和接口

文章目录 1.抽象类2.常见的抽象类2.1 Number类2.2 Calendar 和GregorianCalendar 3.接口4.常见接口4.1 Comparable 接口4.2 Cloneable 接口4.3 深浅拷贝 5.类的设计原则 1.抽象类 在继承的层次结构中&#xff0c;每个新的子类都使类变得更加明确和具体。如果从一个子类向父类追…

IDEA中创建一个SpringBoot项目并提交到git仓库(日常开发-保姆级手把手超详细截图)

日常开发 第一步&#xff1a; 第二步&#xff1a; &#x1f388;边走、边悟&#x1f388;迟早会好 Git是什么&#xff1f; Git是一款免费、开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。 Git是一个开源的分布式版本控制系统&#xff0c;可…

【保卫花果山】游戏

游戏介绍 拯救花果山是一款玩家能够进行趣味闯关的休闲类游戏。拯救花果山中玩家需要保护花果山的猴子&#xff0c;利用各种道具来防御妖魔鬼怪的入侵&#xff0c;游戏中玩家需要面对的场景非常的多样&#xff0c;要找到各种应对敌人的方法。拯救花果山里玩家可以不断的进行闯…

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-20 读写I2C接口的RTC时钟芯片

软件版本&#xff1a;Anlogic -TD5.9.1-DR1_ES1.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用安路(Anlogic)FPGA 实验平台&#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…

超声波清洗机选哪款比较好?推荐四款性价比超高型号

2024年的超声波清洗机技术已经取得了显著进步。市面上的超声波清洗机种类繁多&#xff0c;功能各异&#xff0c;有的可以彻底清洁眼镜&#xff0c;有的还能进行消毒等。今天&#xff0c;我向大家推荐几款我亲自测试过的超声波清洗机&#xff0c;它们的性能都相当优秀&#xff0…

分布式搜索引擎ES-elasticsearch入门

1.分布式搜索引擎&#xff1a;luceneVS Solr VS Elasticsearch 什么是分布式搜索引擎 搜索引擎&#xff1a;数据源&#xff1a;数据库或者爬虫资源 分布式存储与搜索&#xff1a;多个节点组成的服务&#xff0c;提高扩展性(扩展成集群) 使用搜索引擎为搜索提供服务。可以从海量…