将Navicat右键表【对象信息】-【DDL】的内容转换为JavaBean

将Navicat右键表【对象信息】-【DDL】的内容转换为JavaBean

一、Navicat右键表【对象信息】-【DDL】样式

CREATE TABLE `test_result` (
  `id` varchar(60) NOT NULL COMMENT 'id',
  `taskid` varchar(100) DEFAULT NULL COMMENT '任务编号',
  `inspection_code` varchar(100) DEFAULT NULL COMMENT '关联操作大类编码',
  `inspection_param_code` varchar(100) DEFAULT NULL COMMENT '操作项编码',
  `content1` varchar(255) DEFAULT NULL COMMENT '内容1',
  `content2` varchar(255) DEFAULT NULL COMMENT '内容2',
  `content3` varchar(255) DEFAULT NULL COMMENT '内容3',
  `content4` varchar(255) DEFAULT NULL COMMENT '内容4',
  `input_val` varchar(1000) DEFAULT NULL COMMENT '输入内容',
  `dlt` int(10) DEFAULT '0' COMMENT '逻辑删除',
  `insert_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '插入时间',
  `last_modify_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '上次修改时间',
  `update_time` datetime DEFAULT NULL,
  `oper_type` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

二、JavaBean样式

package com.rhino.common.db;

import org.xutils.db.annotation.Column;

/**
 * @author LuoLin
 * @since Create on 2019/1/3.
 */
public class BaseEntity {
    /**
     * 是否可用(0可用,1不可用)
     */
    public static final String ENABLED = "enabled";
    @Column(name = ENABLED)
    public String enabled;
    /**
     * 最后修改时间
     */
    public static final String LAST_MODIFY_TIME = "last_modify_time";
    @Column(name = LAST_MODIFY_TIME)
    public String last_modify_time;
    /**
     * 创建时间
     */
    public static final String CREATE_TIME = "create_time";
    @Column(name = CREATE_TIME)
    public String create_time;
}

三、实现原理

通过读文件,获取关键字内容,写入class类中。

四、源码

这里直接贴出源码,源码注释很全面,这里就不赘述了。

package com.rhino.common.db;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import io.reactivex.annotations.NonNull;

/**
 * <p>将Navicat右键表【对象信息】-【DDL】的内容转换为JavaBean</p>
 *
 * @author LuoLin
 * @since Create on 2019/1/14.
 */
public class EasyCreateJavaBean {

    /**
     * 输入配置文件,将Navicat右键表【对象信息】-【DDL】的内容拷贝在该文件中,支持多表操作
     */
    public static final String SOURCE_FILE_PATH = "D:\\Workspace\\KSI\\evaluation360-android\\common\\src\\main\\java\\com\\cnksi\\common\\db\\createJavaBean.sql";
    /**
     * JavaBean输出目录
     */
    public static final String OUTPUT_PATH = "D:\\Workspace\\KSI\\evaluation360-android\\login\\src\\main\\java\\com\\cnksi\\evaluation360\\entity";
    /**
     * JavaBean所在包名
     */
    public static final String OUTPUT_FILE_PACKAGE_NAME = "com.cnksi.evaluation360.entity";
    /**
     * JavaBean的基类包名,可以为空
     */
//    public static final String BASE_CLASS_PAKAGE_NAME = "com.cnksi.common.db";
    public static final String BASE_CLASS_PAKAGE_NAME = null;
    /**
     * JavaBean的基类,可以为空
     */
//    public static final String BASE_CLASS = "BaseEntity";
    public static final String BASE_CLASS = null;
    /**
     * 用于排除基类已经存在的字段,可以为空
     */
//    public static final String[] INVALID_COLUMN_NAME = new String[] {
//            "enabled", "last_modify_time", "create_time"
//    };
    public static final String[] INVALID_COLUMN_NAME = null;


    /**
     * Main
     */
    public static void main(String[] args) {
        createJavaBean(SOURCE_FILE_PATH);
    }

    /**
     * Navicat右键表【对象信息】-【DDL】的内容转换为JavaBean
     *
     * @param sqlFilePath 文件路径
     */
    public static void createJavaBean(String sqlFilePath) {
        String sqlFileContent = readFile(sqlFilePath);
        String[] tableContents = sqlFileContent.split("CREATE ");
        for (String tableContent : tableContents) {
            if (tableContent.isEmpty()) {
                continue;
            }
            String tableName = getTableName(tableContent);
            String className = createClassNameByTableName(tableName);
            writeFile(OUTPUT_PATH + File.separator + className + ".java", createClassContent(className, tableName, tableContent));
        }
    }

    /**
     * 获取表名称
     *
     * @param tableContent 表内容
     * @return 表名称
     */
    @NonNull
    public static String getTableName(String tableContent) {
        int start = tableContent.indexOf("TABLE `") + 7;
        int end = tableContent.indexOf("` (");
        return tableContent.substring(start, end);
    }

    /**
     * 获取表注释
     *
     * @param tableContent Navicat右键表【对象信息】-【DDL】的内容转换为JavaBean
     * @return 表注释
     */
    @NonNull
    public static String getTableComment(String tableContent) {
        String[] lineContent = tableContent.split("\r\n");
        int start = lineContent[lineContent.length - 1].indexOf("COMMENT='") + 9;
        int end = lineContent[lineContent.length - 1].indexOf("';");
        if (start >= 9) {
            return lineContent[lineContent.length - 1].substring(start, end);
        }
        return "";
    }

    /**
     * 获取主键
     * @param tableContent Navicat右键表【对象信息】-【DDL】的内容转换为JavaBean
     * @return 主键
     */
    @NonNull
    public static String getPrimaryKey(String tableContent) {
        String[] lineContent = tableContent.split("\r\n");
        for (String line : lineContent) {
            if (line.contains("PRIMARY KEY")) {
                int start = line.indexOf("PRIMARY KEY (`") + 14;
                int end = line.indexOf("`)");
                return line.substring(start, end);
            }
        }
        return "";
    }

    /**
     * 创建class文件内容
     *
     * @param className    class名称
     * @param tableName    表名称
     * @param tableContent Navicat右键表【对象信息】-【DDL】的内容转换为JavaBean
     * @return class文件内容
     */
    @NonNull
    public static String createClassContent(String className, String tableName, String tableContent) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("package ").append(OUTPUT_FILE_PACKAGE_NAME).append(";\n\n");
        if (BASE_CLASS_PAKAGE_NAME != null && !BASE_CLASS_PAKAGE_NAME.isEmpty()) {
            stringBuilder.append("import ").append(BASE_CLASS_PAKAGE_NAME).append(".").append(BASE_CLASS).append(";\n");
        }
        stringBuilder.append("import org.xutils.db.annotation.Column;\n");
        stringBuilder.append("import org.xutils.db.annotation.Table;\n\n");
        stringBuilder.append(createComment("", getTableComment(tableContent)));

        stringBuilder.append("@Table(name = \"").append(tableName).append("\")\n");
        if (BASE_CLASS != null && !BASE_CLASS.isEmpty()) {
            stringBuilder.append("public class ").append(className).append(" extends ").append(BASE_CLASS).append(" {\n\n");
        } else {
            stringBuilder.append("public class ").append(className).append(" {\n\n");
        }

        String primaryColumName = getPrimaryKey(tableContent);
        String[] lineContent = tableContent.split("\r\n");
        for (int i = 1; i < lineContent.length - 2; i++) {
            String line = lineContent[i];
            String columnName = "";
            String columnComment = "";
            int start = line.indexOf("  `") + 3;
            int end = line.indexOf("` ");
            if (start >= 3) {
                columnName = line.substring(start, end);
            }

            start = line.indexOf(" COMMENT '") + 10;
            end = line.indexOf("',");
            if (start >= 10) {
                columnComment = line.substring(start, end);
            }
            boolean valid = true;
            if (INVALID_COLUMN_NAME != null) {
                for (String c : INVALID_COLUMN_NAME) {
                    if (c.equals(columnName)) {
                        valid = false;
                        break;
                    }
                }
            }
            if (valid) {
                boolean isPrimary = primaryColumName.equals(columnName);
                stringBuilder.append(createColumn(columnName, columnComment, isPrimary));
            }
        }
        stringBuilder.append("\n}");
        return stringBuilder.toString();
    }

    /**
     * 创建class名称
     *
     * @param tableName 表名称
     * @return class名称
     */
    @NonNull
    public static String createClassNameByTableName(String tableName) {
        String[] ws = tableName.split("_");
        StringBuilder stringBuilder = new StringBuilder();
        for (String w : ws) {
            stringBuilder.append(w.substring(0, 1).toUpperCase()).append(w.substring(1, w.length()));
        }
        stringBuilder.append("Entity");
        return stringBuilder.toString();
    }

    /**
     * 创建注释
     *
     * @param tabSpace 左边间隔
     * @param comment  注释名称
     * @return string
     */
    @NonNull
    public static String createComment(String tabSpace, String comment) {
        return new StringBuilder().append(tabSpace).append("/**\n").append(tabSpace).append(" * ").append(comment).append("\n").append(tabSpace).append(" */\n").toString();
    }

    /**
     * 创建字段
     *
     * @param columnName    字段名称
     * @param columnComment 字段注释
     * @return string
     */
    @NonNull
    public static String createColumn(String columnName, String columnComment, boolean isPrimary) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(createComment("    ", columnComment));
        stringBuilder.append("    public static final String ").append(columnName.toUpperCase()).append(" = \"").append(columnName).append("\";\n");
        if (isPrimary) {
            stringBuilder.append("    @Column(name = ").append(columnName.toUpperCase()).append(", isId = true)\n");
        } else {
            stringBuilder.append("    @Column(name = ").append(columnName.toUpperCase()).append(")\n");
        }
        stringBuilder.append("    public String ").append(columnName).append(";\n");
        return stringBuilder.toString();
    }

    /**
     * 读文件
     *
     * @param filePath 文件路径
     * @return 文件内容
     */
    public static String readFile(String filePath) {
        try {
            int length;
            byte[] bytes = new byte[1024];
            FileInputStream mFileInputStream = new FileInputStream(filePath);
            ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
            while ((length = mFileInputStream.read(bytes)) != -1) {
                arrayOutputStream.write(bytes, 0, length);
            }
            mFileInputStream.close();
            arrayOutputStream.close();
            return new String(arrayOutputStream.toByteArray());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 写文件
     *
     * @param filePath    文件路径
     * @param fileContent 文件内容
     * @return true 写入成功
     */
    public static boolean writeFile(String filePath, String fileContent) {
        System.out.println("输出文件:" + filePath);
        FileOutputStream mFileOutputStream;
        try {
            mFileOutputStream = new FileOutputStream(filePath);
            mFileOutputStream.write(fileContent.getBytes());
            mFileOutputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}

版权声明:本文为u013254166原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。