将美化(格式化)的sql语句转成Java中的StringBuffer拼接的一行行字符串/反过来

1. 需求背景

现在所在的项目,dao层是用jdbcTemplate封装的, 所有都是自己写sql语句, 一般是在NavicatPremium中写好sql语句, 再自己一行一行复制到IDEA中, 一旦需要连接多个表进行查询, sql语句比较多的时候,, 容易出错而且十分麻烦
给大家感受一下:

将美化(格式化)的sql语句转成Java中的StringBuffer拼接的一行行字符串/反过来_第1张图片

一行一行复制到IDEA中:

将美化(格式化)的sql语句转成Java中的StringBuffer拼接的一行行字符串/反过来_第2张图片

是一个十分没有技术含量并且很容易出错的活. 于是我就想到写一个工具类来解决这个问题. 并且可以将–后面注释的内容过滤掉,避免sql出错

2. 工具类, BufferReader和BufferWriter

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Sql2JavaUtil {
    //如果要转成java字符串, 将格式化的sql文件复制粘贴在E盘的sql.txt中
    private static String sqlFile = "E:/sql.txt";
    //如果要将字符串转成sql语句, 将所有"sb.append(" ... ")包裹的sql语句都复制到java.txt中"
    private static String javaFile = "E:/java.txt";

    public static void main(String[] args)throws Exception {
        //true为不覆盖之前的文件,false为覆盖
//        sql2Java("sb",sqlFile,javaFile,true);
        sql2Java("sql",sqlFile,javaFile,false);
//        java2Sql("sb",javaFile,sqlFile,true);
//        java2Sql("sql",javaFile,sqlFile,false);
    }


    /**
     * 将格式化后的sql文件,或普通的txt文件,读取每一行sql语句,用"sb.append("")来包裹"
     * @param var       stringbuffer的变量
     * @param sqlPath   sql文件的路径
     * @param javaFile  java文件的路径
     * @param isAppend  是否在原文件后拼接
     * @throws Exception
     */
    public static void sql2Java(String var,String sqlPath,String javaFile,boolean isAppend)throws Exception{
        BufferedReader br = new BufferedReader(new FileReader(sqlPath));
        BufferedWriter bw = new BufferedWriter(new FileWriter(javaFile,isAppend));
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date = format.format(new Date());
        String str = "";
        if (isAppend){
            bw.newLine();
            bw.write("--------------------"+date+"-------------------------");
            bw.newLine();
        }
        while((str = br.readLine()) != null) {
            if (!str.trim().equals("")){
                str = str.trim();
                int i = -1;
                //去掉注释
                if ((i = str.indexOf("-- ")) != -1){
                    str = str.substring(0,i);
                }
                if (!str.trim().equals("")){
                    bw.write(" "+var+".append(\" " + str.trim() + " \");");
                    bw.newLine();
                }
            }
        }
        bw.close();
        br.close();
        System.out.println("java文件输出ok");
    }

    /**
     * 将java代码中被"sb.append("")来包裹的sql文件,还原成原来的sql
     * @param var       stringbuffer的变量名
     * @param javaPath  java文件的路径
     * @param sqlPath   sql文件的路径
     * @param isAppend  是否在原文件后拼接
     * @throws Exception
     */
    public static void java2Sql(String var,String javaPath,String sqlPath,boolean isAppend)throws Exception{
        BufferedReader br = new BufferedReader(new FileReader(javaPath));
        BufferedWriter bw = new BufferedWriter(new FileWriter(sqlPath));
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date = format.format(new Date());
        String str = "";
        if (isAppend){
            bw.newLine();
            bw.write("--------------------"+date+"-------------------------");
            bw.newLine();
        }
        while((str = br.readLine()) != null) {
            bw.write(str.trim().replace(var+".append(\"","").replace("\");",""));
            bw.newLine();
        }
        bw.flush();
        bw.close();
        br.close();
        System.out.println("sql文件输出ok");
    }

}

这里的话我是把文件放在E:/根目录 ,StringBuffer的变量名是sql,大家可以自己根据自己的情况更改

将美化(格式化)的sql语句转成Java中的StringBuffer拼接的一行行字符串/反过来_第3张图片
效果如下:
将美化(格式化)的sql语句转成Java中的StringBuffer拼接的一行行字符串/反过来_第4张图片

你可能感兴趣的:(数据库)