java 脚本处理sql脚本文件,生成指定文件格式(数据结构,IO流等知识)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
*
* 功能:
* 处理*.sql文件
* 需求:
* 修改所有varchar字段的的长度
* 原长度小于等于10,则加10处理
* 原长度大于10,则*2处理
* 目标:
* 生成符合数据库语法的后缀名位.sql的文本文件
*
* @author andy_zhou.china@outlook.com
*
*/
public class UpdateSqlFile {

public static void main(String[] args) throws Exception {

BufferedReader br = new BufferedReader(new FileReader("d:\\sql\\test01.sql"));
BufferedWriter bw = new BufferedWriter(new FileWriter("d:\\sql\\test02.sql"));

ArrayList<String> list = new ArrayList<String>();
Map<String, Map<String, Integer>> tableEntry = new HashMap<String, Map<String,Integer>>();
Map<String, Integer> map = null;

String line = null;
StringBuffer strb = null;
String tableName = null;
String cloumn = null;
int len = 0;

while((line = br.readLine()) != null){
if(line.contains("CREATE TABLE") && !line.contains("--")){
strb = new StringBuffer(line + "\r\n");
} else if(!line.contains(";") && strb != null && !line.contains("--")){
if(strb != null){
strb.append(line + "\r\n");
}
}else if(line.contains(":") && strb != null){
strb.append(line+"\r\b");
list.add(strb.toString());
strb = null;
}
}

for (int i = 0; i < list.size(); i++) {
tableName = list.get(i).substring(list.get(i).indexOf("CREATE TABLE"), list.get(i).indexOf("("))
.replaceAll(" ", "").replaceAll("\"", "");
String[] info = list.get(i).split("\r\n");
map = new HashMap<String, Integer>();

for (int j = 0; j < info.length; j++) {
info[0] = info[0].substring(info[0].indexOf("("));
if(info[j].contains("VARCHAR") && info[j].contains("(") && info[j].contains(")")){

cloumn = info[j].substring(info[j].indexOf("\"") + 1, info[j].lastIndexOf("\""));
len = Integer.parseInt(info[j].substring(info[j].lastIndexOf("("), info[j].indexOf(")")));

map.put(cloumn, len);
}
}
tableEntry.put(tableName, map);
}

String str = null;
for (Map.Entry<String, Map<String, Integer>> entryTable : tableEntry.entrySet()) {
for (Map.Entry<String, Integer> entry : entryTable.getValue().entrySet()) {
int temp;
if(entry.getValue() <= 10){
temp = entry.getValue() + 10;
}else{
temp = entry.getValue() * 2;
}
str = "alter table " + entryTable.getKey() + " alter " + entry.getKey() + "set data type varchar(" + temp + ");";

bw.write(str);
bw.newLine();
bw.flush();
}
}
bw.close();
br.close();
}
}

转载于:https://www.cnblogs.com/cl-andy/p/9908888.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、简介 1.1前言 1、由于最近工作一直用Oracle,故对Oracle数据库研究为对象。 2、根据工作业务需求实际情况进行功能研发。为什么要开发呢?因为在数据库升级或者迁移的时候,为了保证不同环境不同数据库数据保持同步,故数据库SQL脚本非常作用。比如:数据库脚本,副脚本,增量脚本。 3、 什么是主脚本、副脚本、增量脚本呢? 3.1、主脚本数据库表或存储过程,视图脚本,序列等脚本。 3.2、副脚本指必须执行主脚本之后才执行的脚本。换句话说在没执行主键脚本的情况下,副脚本执行之后会回滚事务失败。 3.3、增量脚本指在执行主脚本或副脚本之后,根据需求对某个表添加/修改约束(主外键约束,长度约束等),添加/修改字段/添加数据等情况对数据库结构改变处理的一种行为脚本。 1.2作用 1、 快速产出自定义规则需要的SQL脚本。 2、减少人工编写SQL脚本出错率问题,完全通过程序检测SQL准确性。 3、帮助开发人员提高SQL编写效率,减少人工编写SQL开发成本问题。 4、帮助开发人员节约时间,同时避免繁琐不必要编写SQL的工作。 二、实现方式与原理 2.1实现方式 1、实现方式分:正向与逆向实现。什么是正向与逆行呢【是否有鸡还是有蛋,先后道理同等】 2、正向方式:首先把设计好数据库表文档,把所有表的字段属性配置到EXCEL或者CSV格式的文件通过JXL/POI技术去读取文件的字段,再通过其他技术一系列程序处理之后生成所需要的SQL脚本。 3、逆向方式:首先有数据库表,然后通过ORM持久化技术连接数据库再读取表的字段等属性出来,再通过其他技术一系列程序处理之后生成所需要的SQL脚本。 2.2原理 对数据库软件内置核心表或视图查询出来存储用户行为表结构所有属性信息,对此属性结构信息进行分析与组装所需要SQL脚本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值