Mysql数据注释解析成查询语句

75 阅读1分钟

场景

在实际的开发过程中我们可能会遇到,将一个表的字段转换成查询sql,例如:

select name as "姓名",age as "年龄" from acount

或者说根据sql将数据导出到excel中,这时候excel表头的注释不能是字段名称,要应用成相关字段的注释。如果字段少手写也是可以的,麻烦点就在与字段一多就很累。

解决问题

使用工具类MysqlCommentParse就可以帮你解决这个头痛的问题。

public class MysqlCommentParse {

    /**
     * 注释示例:
     * sno         int unsigned auto_increment comment '学号',
     * name        varchar(50) not null comment '姓名',
     * create_date date not null comment '创建时间',
     * 解析后的sql:
     * select SNO as '学号',NAME as '姓名',CREATE_DATE as '创建时间' from account
     */
    public static void main(String[] args) {

        String fileName = "文件地址\\文件名称.txt";

        String table = "表名";

        LinkedHashMap<String, String> map = new LinkedHashMap<>();

        try {
            Scanner sc = new Scanner(new FileReader(fileName));
            //分隔符
            sc.useDelimiter(",");
            //按分隔符读取字符串
            while (sc.hasNext()) {
                String str = sc.next().toUpperCase();

                //判断字段的位置 默认第一个空格出现的位置
                int indexColumn = str.indexOf(" ");

                //判断注释comment出现的最后位置
                int indexComment = str.lastIndexOf("COMMENT");
                //获取字段
                String column = str.substring(0,indexColumn);

                //获取字段注释
                String columnComment = str.substring(indexComment + 7, str.length());

                map.put(column, columnComment.trim());

            }


            //拼接成查询sql
            StringBuilder sb = new StringBuilder();
            sb.append("select ");
            for (Map.Entry<String, String> entry : map.entrySet()) {

                sb.append(entry.getKey()).append(" as ").append(entry.getValue()).append(",");
            }
            sb.deleteCharAt(sb.length() - 1);
            sb.append(" from ").append(table);

            System.out.println(sb.toString());
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

}

示例:

提供一份txt文件,格式如下:

 sno         int unsigned auto_increment comment '学号',
 name        varchar(50) not null comment '姓名',
 create_date date not null comment '创建时间',

第一步 读取文件内容

工具类中 以 , 为结尾读取第一行数据, 这时候读取的结果:sno int unsigned auto_increment comment '学号',

第二步 java的字符截取

 //判断字段的位置 默认第一个空格出现的位置
 int indexColumn = str.indexOf(" ");

 //判断注释comment出现的最后位置
 int indexComment = str.lastIndexOf("COMMENT");

 //获取字段
 String column = str.substring(0,indexColumn);

 //获取字段注释
 String columnComment = str.substring(indexComment + 7, str.length());

结果

select SNO as '学号',NAME as '姓名',CREATE_DATE as '创建时间' from account

工具类源码地址

地址:github.com/POWERzhangd…