将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;
    }
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
博客地址:http://blog.csdn.net/vipbooks 一直以来把数据库转换成Entity或DTO都是一件让人头痛的事情,既浪费时间又很繁琐,看着几十上百个的几百上千个字段,真是一件让人很头痛的事情。 我们也想过很多办法解决这个问题,包括用MyEclipse连接数据库生成JavaBean,但多多少少还是会有一些不尽人意的地方,包括字段的comment总是无法生成,而且还会生成很多无用的注释代码,让代码看起来一点都不干净,配置非常繁琐等等问题。 于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据库生成JavaBean工具,支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除前缀,并支持去除多个前缀,支持精确指定只生成哪几个的Bean,也支持模糊查找生成哪几个的Bean,现在不但成员变量上能生成备注了,而且在Getter和Setter上也能有备注了! 更重要的是所有的配置都能被保存到本地,只要配置过一次,下次使用只要点一下生成JavaBean,下一秒就能拿到你想要的JavaBean了,完全实现秒生成。并且集成各种实用工具,使得工作效率瞬间爆棚,生产力瞬间爆! 该压缩包中包含32位和64位两个版本。 第11版更新震撼发布,此次版本更新如下: 1、新增数据源配置管理功能,可以为每种类型的数据库添加多个不同的数据源。 2、新增快速新增数据源功能,快速为当前选中的数据库添加数据源。 3、新增打开目录功能,左键打开菜单选择要打开的目录,点击右键可以快速打开当前应用所在目录。 4、新增对使用驼峰命名的名和字段名的支持,例如名是UserInfo,生成Bean的类名也是UserInfo; 字段名是userId,那么生成的Bean字段也是userId。 5、主界面移除驱动名下拉选项,并新增快速切换数据源配置下拉选项。 6、改进精确匹配中“更多”的选功能,在文本框中已选中的在打开选对话框时会被勾选。 7、改进清除StringBuffer工具,选择SQL类型会自动将“//”替换为“--”。 8、改进字符串格式化工具,将有更多类型可选,操作更方便。 9、其他一些小Bug的修改和代码优化调整。
一直以来把数据库转换成Entity或DTO都是一件让人头痛的事情,既浪费时间又很繁琐,看着几十上百个的几百上千个字段,真是一件让人很头痛的事情。 我们也想过很多办法解决这个问题,包括用MyEclipse连接数据库生成JavaBean,但多多少少还是会有一些不尽人意的地方,包括字段的comment总是无法生成,而且还会生成很多无用的注释代码,让代码看起来一点都不干净,配置非常繁琐等等问题。 于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据库生成JavaBean工具,支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除前缀,并支持去除多个前缀,支持精确指定只生成哪几个的Bean,也支持模糊查找生成哪几个的Bean,现在不但成员变量上能生成备注了,而且在Getter和Setter上也能有备注了! 更重要的是所有的配置都能被保存到本地,只要配置过一次,下次使用只要点一下生成JavaBean,下一秒就能拿到你想要的JavaBean了,完全实现秒生成。并且集成各种实用工具,使得工作效率瞬间爆棚,生产力瞬间爆。 第10版更新震撼发布,效率大提升,功能更加强大,速度过来围观,这次版本更新如下: 1、新增数据库连接池并可以手动配置,提升数据库连接的使用效率。 2、新增多线程并发处理并可以手动配置,大大提升数据收集和文件生成的效率。 3、增强字符串格式化工具,使得自动拼接字符串的应用场景更多。 4、测试数据库连接、生成Bean文件、精确匹配的更多等按钮都使用了异步线程进行处理, 这样界面不再会被卡住了,点了这些按钮以后还可以同时对界面进行其他操作, 如:移动、最小化、设置参数、使用集成工具等。 5、生成Bean文件按钮添加计时功能,当点击该按钮以后,按钮上的文字会变为读秒计时, 这样就不会以为程序卡死了。 6、更新Oracle的数据库驱动包,提升了数据库连接和查询的速度。 7、更新MySQL的数据库驱动包。 8、其他一些小Bug的修改和代码优化调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值