通过java产生数据库部署脚本

4 篇文章 0 订阅
package com.dtxytech.account.generate;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.ZoneOffset;

public class SqlFileGenerate {
    static String globalPath = "D:/plsql";//sql脚本所在路径
    static String localPath = "D:\\plsql\\";//sql脚本所在路径
    static String fileName = "init.sql";//产生的sql脚本文件
    static String logfileName = "init.log";//产生的日志文件
    static String split = "/";
    static File myFile;
    static Writer write;
    static long fileUpdateDate = LocalDateTime.of(2022, 5, 5, 11, 0).
            toInstant(ZoneOffset.ofHours(+8)).toEpochMilli();//这个日期以后修改文件

    public static void main(String[] args) throws Exception {
        myFile = new File(globalPath + split + fileName);
        if (!myFile.exists())
            myFile.createNewFile();
        write = new OutputStreamWriter(new FileOutputStream(myFile), StandardCharsets.UTF_8);
        write.write("spool " + logfileName+"\n");
        write.write("set define off;\n");
        getFileName(globalPath);
        write.write("set define off;\n" +
                "prompt 结束;\n");
        write.write("spool off");
        write.flush();
        write.close();
    }

    public static void getFileName(String path) throws IOException {
        String tempPath;
        File f = new File(path);
        if (!f.exists()) {
            System.out.println(path + " not exists");
            return;
        }

        File fa[] = f.listFiles();
        for (int i = 0; i < fa.length; i++) {//循环遍历
            File fs = fa[i];//获取数组中的第i个
            String name = fs.getName();
            if (fs.isDirectory()) {
                tempPath = path + split + name;
                getFileName(tempPath);
            } else if (!path.equals(globalPath) && (name.toLowerCase().endsWith(".sql")
                    || name.toLowerCase().endsWith(".pck")
                    || name.toLowerCase().endsWith(".trg")
            )
                    && fs.lastModified() > fileUpdateDate
            ) {
                write.write("prompt Creating " + name+"\n");
                write.write("prompt ================================"+"\n");
                write.write("@@" + fs.getCanonicalPath().replace(localPath, "")+"\n");
            }
        }
    }
}
  • 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、付费专栏及课程。

余额充值