zoukankan      html  css  js  c++  java
  • easygen通用代码生成框架[开源]

    什么东东

    用过mybatis的同学都知道,手工写mapper和xml是一件很痛苦的事儿,幸好官方提供了Mybatis-Generator,但是这家伙生成的东西不开放不方便修改,而且项目中的代码生成需求不只是数据访问层,比如说view、service、controller,这些地方到处充斥着重复代码,有什么好办法了,反正我是见识少,只能自己动手了。

    设计思路

    简单点,设计的思路简单点,只有简单别人才好上手。

    • 1.利用模板引擎加载模型,渲染模板,生成文件。
    • 2.模型由模型构建器加载,要内置mysql元数据作为模型,支持自定义其他模型构建器
    • 3.模型和模板文件要分离,这样模型可以重用到其他模板
    • 4.模型和模板文件是一对多的关系,方面根据一个表生成po、mapper、service
    • 5.支持一个模型批量生成,如数据库表这种,不能每个表对应一个模型吧

    先不要想那么多,就这些吧

    使用方式设计

    很多同学一上来就写代码,最后根据功能设计使用方式,我更倾向于先把使用方式设计好,俗话说好的开始是成功的一半。

    1. 代码生成方式简单点,那就 java -jar xxxx.jar吧,然后在ohmyzsh里配置一下alias就爽了。
    2. 配置文件用json 简单好维护,文件名和路径默认,支持修改。
    3. 发布包提供样板,方便学习和使用。

    好了,先YY一个配置文件,看看:

    {
      "modelBuilders": [
        {
          "name": "mysql", //模型构建器名称要
          "type": "db:mysql", //构建器类型
          "configPath": "modelBuilders/mysql.json" //数据库配置
        }
      ],
      "templates": [
        {
          "name": "beanClass",
          "modelBuilderName": "mysql", //关联的模型构建器name
          "templateFilename": "beanClass.ftl",
          "outputPath": "output/bean"
        }
      ]
    }
    

    恩就这样,是不是有点晕,我解释一下:

    • 1.首先我们的框架加载配置文件。
    • 2.然后根据配置文件中的modelBuilders加载指定type的模型构建器
    • 3.然后将configPath指定的配置文件传给模型构建器,用于构建数据模型
    • 4.框架根据配置文件中的templates中的每一个元素的modelBuilderName属性去关联已经构建好的模型构建器。
    • 5.然后框架使用模型构建器构建Model,并根据templateFilename指定的模板文件进行渲染(使用freemarker)
    • 6.输出文件到outputPath

    最终效果

    github: https://github.com/BigMaMonkey/easygen

    其实框架的代码很简单,重点还是设计好使用方式,简单并可扩展,其实过程中还需要一些其他特性:

    • 基于freemarker的模板语法,上手简单
    • 内置mysql、json模型构建器,并支持自定义
    • 支持生成指定表、去掉表前缀、转换大小写等
    • 支持模型与模板的一对多关系(模型与模板的分离)
    • 支持List类型的模型,批量生成。
    • 支持自定义文件名生成规则
    • 支持自定义输出路径
    • 支持模板自定义参数

    以下示例演示了应用于mybatis的代码生成使用。

    1.首先下载easygen发布包 下载

    解压后,包含以下几部分:

    • easygen-1.0-SNAPSHOT.jar:这是easygen主程序,负责读取配置文件并生成代码
    • config.json:这是easy主配置文件
    • modelBuildrs:这里存放的是模型构建器的配置文件
    • templates:这是里存放的是模板文件
    • lib:这里存放的是easygen引用的第三方jar包

    2.编写主配置文件

    目录下的config.json为主配置文件, 发布包已经给出了一个比较完整的配置,包括型构建器配置和模板配置,包括生成bean、mapperclass、mapperxml、serviceInterface、serviceImpl、view、dbtojson(生成数据库元数据)很简单自己看配置和代码就行了。。。

    {
      "modelBuilders": [
        {
          "name": "mysql", //构建器名称要唯一
          "type": "db:mysql", //构建器类型目前只支持mysql和json两种
          "configPath": "modelBuilders/mysql.json" //数据库配置和生成表指定
        },
        {
          "name": "json",
          "type": "json",
          "configPath": "modelBuilders/data.json" //与mysql构建器不同的是,这里直接是模型数据。
        },
        {
          "name": "http",
          "type": "custom", //自定义的构建器
          "configPath": "modelBuilders/xxx.json", //这个json反序列化类型需要在IModelBuilder的泛型参数中指出。
          "modelBuilderClassName": "org.BigMaMonkey.XXX.XXX" //自定义的构建器需要实现类,实现IModelBuilder借口
        }
      ],
      "templates": [
        {
          "name": "mapperXml",
          "modelBuilderName": "json", //关联的构建器名称,不是类型
          "templateFilename": "data.ftl", //ftl模板文件
          "outputPath": "output/data", //输出目录,会自动递归创建目录。
          "outputFilenameRule": "data_{name}.xml", //输出文件名规则,{}内变量为模型的字段field
          "options": {} //自定义模板参数,可以在模板中使用,请自由发挥。
        },
        {
          "name": "mapperXml",
          "modelBuilderName": "mysql",
          "templateFilename": "mapperXml.ftl",
          "outputPath": "output/mapperXml",
          "outputFilenameRule": "{upperCaseName}Mapper.xml",
          "options": {
            "mapperns": "org.bigmonkey.robot.mapper",
            "pons": "org.bigmonkey.robot.entity.po"
          }
        },
        {
          "name": "beanClass",
          "modelBuilderName": "mysql",
          "templateFilename": "beanClass.ftl",
          "outputPath": "output/bean",
          "outputFilenameRule": "{upperCaseName}.java",
          "options": {
            "pons": "org.bigmonkey.robot.entity.po"
          }
        },
        {
          "name": "mapperClass",
          "modelBuilderName": "mysql",
          "templateFilename": "mapperClass.ftl",
          "outputPath": "output/mapper",
          "outputFilenameRule": "{upperCaseName}Mapper.java",
          "options": {
            "pons": "org.bigmonkey.robot.entity.po",
            "mpns": "org.bigmonkey.robot.mapper"
          }
        },
        {
          "name": "serviceInterface",
          "modelBuilderName": "mysql",
          "templateFilename": "serviceInterface.ftl",
          "outputPath": "output/service",
          "outputFilenameRule": "I{simpleName}Service.java",
          "options": {
            "pons": "org.bigmonkey.robot.entity.po",
            "itns": "org.bigmonkey.robot.service"
          }
        },
        {
          "name": "serviceImpl",
          "modelBuilderName": "mysql",
          "templateFilename": "serviceImpl.ftl",
          "outputPath": "output/service",
          "outputFilenameRule": "{simpleName}ServiceImpl.java",
          "options": {
            "pons": "org.bigmonkey.robot.entity.po",
            "imns": "org.bigmonkey.robot.service.impl"
          }
        },
        {
          "name": "view",
          "modelBuilderName": "mysql",
          "templateFilename": "view.ftl",
          "outputPath": "output/view",
          "outputFilenameRule": "{name}view.vue",
          "options": {}
        },
        {
          "name": "db-to-json",
          "modelBuilderName": "mysql",
          "templateFilename": "dbtojson.ftl",
          "outputPath": "output/json",
          "outputFilenameRule": "{name}.json",
          "options": {}
        }
      ]
    }
    

    3.编写模板
    其实模板的编写很简单,你只需要掌握freemarker的ftl语法,以及基本的json知识就可以了。
    这里只讲解mybatis内置构建器的使用

    3.1.首先是构建器配置

    {
      "name": "mysql", //构建器名称要唯一
      "type": "db:mysql", //构建器类型目前只支持mysql和json两种
      "configPath": "modelBuilders/mysql.json" //数据库配置和生成表指定
    }
    

    type中db:mysql指定使用内置的mysql构建器,configPath指定构建器的配置文件,配置如下:

    {
      "dbUrl": "jdbc:mysql://localhost:3306/device_manage",
      "driverClassName": "com.mysql.jdbc.Driver",
      "username": "root",
      "password": "root",
      "tables": "sys_user,pub_dict" //用,分割指定生成的表名,也可以留空表示生成所有表
    }
    

    3.2.需要给出的是内置mysql构建器的模型结构,你才能在ftl中使用

    {
      "name": "sys_user", //原始表名
      "upperCaseName": "SYS_User", //前缀大写+首字符大写表名,用于创建PO、Mapper等
      "simpleName": "User", // 去掉前缀的表名,目前只支持_分割的表名,如sys_user
      "pkgs": [
        "java.util.Date" // 字段类型对应的Java包,import到java文件
      ],
      "fields": [
        {
          "name": "name", //原始字段名
          "upperCaseName": "Name", //首字母大写字段名
          "dataType": "12", // 字段类型值,对应 java.sql.Types中的枚举值
          "typeName": "VARCHAR", //字段数据库类型,其他类型参见源码:TableField.java
          "columnSize": "32", //字段大小
          "columnType": {
            "javaType": "String", //对应的java类型
            "pkg": null  //基础类型为null,不需要import
          }
        }
      ],
      "primaryKey": {
        //同field中的元素属性
      }
    }
    

    在ftl中模型的跟是model,例如你要在ftl中输出一个表名${model.name}, 又或者是主键的名称${model.primaryKey.name}

    如果你在模板配置中设置了自定义模板参数options,请这样使用它${options.xxx}

    通过在outputFilenameRule中使用{XXX}可以引用model中根属性,来自定义输出文件名,如{upperCaseName}Mapper.java

    4.最后使用方式相当简单:

    java -jar easygen-1.0-SNAPSHOT.jar 
    

    当然你也可以把代码的执行集成到你自己的项目或工具:

    public class App {
        public static void main(String[] args) {
            GeneratorManager generatorManager = new GeneratorManager();
            try {
                generatorManager.Start();
            } catch (Exception e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
            }
        }
    }
    
  • 相关阅读:
    多种 网页文本编辑器 分析
    struts2 令牌 实现源代码 JSP
    ibatis 数据库时间 插入数据
    Eclipse/Myeclipse生成serialVersionUID方法
    SSM框架整合遇到的问题
    搭建Elasticsearch5.6.8 分布式集群
    使用SuperWebSocket 构建实时 Web 应用
    HAPROXY
    .NET面试题系列(二)GC
    MongoDB-3.4集群搭建:分片
  • 原文地址:https://www.cnblogs.com/MinnieChang/p/7039932.html
Copyright © 2011-2022 走看看