GUI 的代码生成器确定不了解了解?

145 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

无聊的时候写的,很简单,娱乐而已。

基于 Mybatis-plus 的代码生成器加上 GUI 实现,可以可视化的生成代码,方便再编写项目时生成一些文件,直接将生成的文件导入项目即可。

效果展示

请添加图片描述

GUI 界面

image-20211203211603989

生成的鸡肋

image-20211203211713674

实战

导入依赖

导入用到的依赖。这里自动生成 Swagger 注释 API,Lombok 注解,所以需要添加Swagger、Lombok依赖,同时由于是使用到基于 Mybatis-plus 的代码生成器生成的,还需要添加mybatis-plus、mybatis-plus-generator的依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.5.5</version>
</dependency>
<!--mybatis-plus-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>3.4.3.4</version>
</dependency>
<!--mybatis-plus 代码生成器-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.1</version>
</dependency>
<!--mysql-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.25</version>
</dependency>
<!--lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.22</version>
    <scope>provided</scope>
</dependency>
<!--freemarker模板-->
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.28</version>
    <scope>compile</scope>
</dependency>
<!--swagger-->
<dependency>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-annotations</artifactId>
    <version>1.6.3</version>
</dependency>

GUI 布局

使用 IDEA 进行最基础的布局。包括操作数据库必须的数据库Url,username,password,生成的作者信息,包路径,以及为指定数据表生成,多个数据表名用英文','分割,全部则为all,OutPutDir显示生成之后的文件路径。

image-20211203160714709

代码生成工具类

对生成策略进行一些简单的配置。

MyBatis-Plus 代码生成器详细讲解的博客:MyBatis-Plus——代码生成器(3.5.1+版本) - 掘金 (juejin.cn)

/**
 *  代码生成工具类
 */
public class GenerateCodeUtils {

    /* 判断参数是否为空,代码生成 */
    public static void isTrue(String sqlUrl, String sqlUserName, String sqlPassword,
                              String outPutDir, String xmlOutPutDir, String sqlTable,
                              String author, String packageName, String modelName) throws Exception {
        if (isNotNull(sqlUrl) && isNotNull(sqlUserName) && isNotNull(sqlPassword) && isNotNull(sqlTable) && isNotNull(packageName) && isNotNull(modelName)) {
            GenerateCode(sqlUrl, sqlUserName, sqlPassword, outPutDir, xmlOutPutDir, sqlTable, author, packageName, modelName);
        } else {
            throw new Exception("字段为空");
        }
    }

    /* 判断参数是否为空 */
    public static boolean isNotNull(String str) {
        return !"".equals(str) && str != null;
    }

    // 处理 all 情况
    protected static List<String> getTables(String tables) {
        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }

    /* 调用 Mybatis-plus 的代码生成器 */
    public static void GenerateCode(String sqlUrl, String sqlUserName, String sqlPassword,
                                    String outPutDir, String xmlOutPutDir, String sqlTable,
                                    String author, String packageName, String modelName) {

        FastAutoGenerator.create(sqlUrl, sqlUserName, sqlPassword)
            // 全局配置
            .globalConfig((scanner, builder) -> builder.author(author)
                          .outputDir(outPutDir)
                          .commentDate("yyyy-MM-dd hh:mm:ss")
                          .dateType(DateType.TIME_PACK)
                          .enableSwagger()
                          .fileOverride()
                          .enableSwagger()
                         )
            // 包配置
            .packageConfig((scanner, builder) -> builder.parent(packageName)
                           .moduleName(modelName)
                           .entity("pojo")
                           .service("service")
                           .serviceImpl("serviceImpl")
                           .mapper("mapper")
                           .xml("mapper")
                           .other("utils")
                           .pathInfo(Collections.singletonMap(OutputFile.mapperXml, xmlOutPutDir))
                          )
            // 策略配置
            .strategyConfig((scanner, builder) -> {
                builder.addInclude(getTables(sqlTable))
                    .serviceBuilder()
                    .formatServiceFileName("%sService")
                    .formatServiceImplFileName("%sServiceImpl")
                    .entityBuilder()
                    .enableLombok()
                    .disableSerialVersionUID()
                    .logicDeleteColumnName("deleted")
                    .naming(NamingStrategy.underline_to_camel)
                    .columnNaming(NamingStrategy.underline_to_camel)
                    .addTableFills(new Column("create_time", FieldFill.INSERT), new Column("modify_time", FieldFill.INSERT_UPDATE))
                    .enableTableFieldAnnotation()
                    .controllerBuilder()
                    .formatFileName("%sController")
                    .enableRestStyle()
                    .mapperBuilder()
                    .superClass(BaseMapper.class)
                    .formatMapperFileName("%sMapper")
                    .enableMapperAnnotation()
                    .formatXmlFileName("%sMapper");
            })
            .templateEngine(new FreemarkerTemplateEngine())
            .execute();

    }

}

GUI 窗口类(部分代码)

GUI 组件的布局,添加一些监听器。

/*
 * GUI 窗口类
*/
public class codeGernal extends JFrame {

    public static void main(String[] args) {
        JFrame frame = new JFrame("codeGernal");
        frame.setContentPane(new codeGernal().AutoGenerateCode);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setResizable(false);
        frame.setVisible(true);
    }

    public void Generate() {
        
        String sqlUrl = SQLURL.getText();
        String sqlUserName = SQLUserName.getText();
        String sqlPassword = SQLPassword.getText();
        String outDir = System.getProperty("user.dir") + "\\代码生成器";
        String outPutDir = System.getProperty("user.dir") + "\\代码生成器\\src\\main\\java";
        String xmlOutPutDir = System.getProperty("user.dir") + "\\代码生成器\\src\\main\\resources\\";
        String sqlTable = SQLTable.getText();
        String author = Author.getText();
        String packageName = PackageName.getText();
        String modelName = ModelName.getText();

        /* 获取输入框的值,调用 GenerateCodeUtils 的方法 */
        try {
            GenerateCodeUtils.isTrue(sqlUrl, sqlUserName, sqlPassword, outPutDir, xmlOutPutDir, sqlTable, author, packageName, modelName);
            OutPutDir.setText(outDir);
            TipsLabel.setText("代码生成成功");
        } catch (Exception exception) {
            TipsLabel.setText(exception.getMessage());
        }
    }

    public codeGernal() {

        /* GenerateButton 鼠标单击事件 */
        GenerateButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                Generate();
            }
        });
        /* ResetButton 鼠标单击事件 */
        ResetButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                SQLURL.setText("jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8");
                SQLUserName.setText("");
                SQLPassword.setText("");
                SQLTable.setText("Enter table names separated by English commas or enter \"all\"");
                Author.setText("");
                PackageName.setText("");
                ModelName.setText("");
                OutPutDir.setText("Auto generate code path");
                TipsLabel.setText("");
            }
        });
        /* SQLTable 获得失去焦点事件 */
        SQLTable.addFocusListener(new FocusAdapter() {
            @Override
            public void focusGained(FocusEvent e) {
                if ("Enter table names separated by English commas or enter \"all\"".equals(SQLTable.getText())) {
                    SQLTable.setText("");
                }
            }
        });
        SQLTable.addFocusListener(new FocusAdapter() {
            @Override
            public void focusLost(FocusEvent e) {
                if ("".equals(SQLTable.getText())) {
                    SQLTable.setText("Enter table names separated by English commas or enter \"all\"");
                }
            }
        });
    }

}