• 技术文章 >Java >java教程

    详解Java Web模板代码生成器的设计与实现

    黄舟黄舟2017-03-18 10:32:23原创758

    起因

    项目中需要根据数据库表写很多Meta、Dao、Service代码,其中很多代码都是重复而繁琐的。因此如果有一个模板代码的生成器,就可以一定程度提高开发效率。

    目标

    可配置生成Java Web项目中Dao、Meta、Service层模板代码的生成器。

    代码框架

    mvn archetype:generate 
    -DgroupId=com.zju 
    -DartifactId=JavaWebCodeGenerator 
    -DarchetypeArtifactId=maven-archetype-webapp 
    -DinteractiveMode=false 
    -DarchetypeCatalog=internal

    设计思路

    项目参考Mybatis generator生成代码的过程,具体步骤分为以下5步。

    逻辑步骤

    1. 解析命令行

    2. 解析配置文件

    3. 获取数据表信息

    4. 生成配置信息

    5. 生成文件

    代码设计

    命令解析类 ShellRunner

    该类负责解析命令行的命令,解析配置文件并封装所需的数据给代码生成类。

    可解析命令有-configfile:指定配置文件所在路径和-overwrite:是否重写目标文件。

    配置文件的配置项有:

    //Java SQL 驱动所在路径(暂未使用)
    private static final String CLASS_PATH_ENTRY = "class.path.entry";
    //Java 驱动类型(暂未使用)
    private static final String DRIVER_CLASS = "driver.class";
    //数据库地址
    private static final String CONNECTION_URL = "connection.url";
    //数据库用户名
    private static final String USER_ID = "user.id";
    //数据库密码
    private static final String USER_PASSWORD = "user.password";
    //模型生成地址
    private static final String JAVA_MODEL_PACKAGE = "java.model.package";
    //SQL生成地址
    private static final String SQL_MAPPING_PACKAGE = "sql.mapping.package";
    //项目地址
    private static final String PROJECT = "project";
    //数据表名
    private static final String TABLE_NAME = "table.name";
    //模型名称
    private static final String DOMAIN_OBJECT_NAME = "domain.object.name";

    代码生成类 CodeGenerator

    该类负责连接数据库,查询数据表的表信息,将SQL类型映射成Java类型并封装所需的数据给文件生成类。

    Class.forName(configuration.getDriverClass());
    //获取数据库连接
    Connection connection = DriverManager.getConnection(configuration.getConnectionURL(), 
    configuration.getUserId(), 
    configuration.getPassword());
    DatabaseMetaData databaseMetaData = connection.getMetaData();
    //获取表结构信息
    ResultSet rs = databaseMetaData.getColumns("", "", configuration.getTableName(), "%");

    通过以上几行代码,rs变量中已经获得目标数据表的表信息。

    databaseMetaData.getColumns方法的实质是执行了SELECT * FROM information_schema.COLUMNS WHERE TABLE_NAME="tableName"语句。

    在结果集中,后续处理大致需要以下表信息列。

    字段描述
    DATA_TYPE数据类型
    COLUMN_SIZE数据长度
    COLUMN_NANE列名
    NULLABLE是否允许非空
    DECIMAL_DIGITS小数位数
    REMARKS备注
    COLUMN_DEF默认值

    最后通过JavaTypeResolver中的类型映射(Map<Integer, JdbcTypeInformation> typeMap)和StringUtils中的驼峰命名转换(getCamelCaseString)将SQL信息转换成Java信息。

    文件生成类 FileGenerator

    该类通过FreeMarker模板引擎组合数据成目标代码文件。

    主逻辑如下:

    /**
    * @param configuration 封装的配置信息
    * @param columns       封装的数据表列信息
    * @throws IOException
    * @throws TemplateException
    */
    public static void writeFile(Configuration configuration, List<TableColumn> columns) throws IOException, 
    TemplateException {
        File r=new File("");
        //测试环境获取项目根目录路径
        //String path=Class.class.getClass().getResource("/").getPath();
        //Jar包获取根目录路径
        String path=r.getAbsolutePath();
        //System.out.println("path:"+path);
        Configuration cfg = new Configuration();
        cfg.setDirectoryForTemplateLoading(new File(path + "/ftl")); //需要文件夹绝对路径
        cfg.setDefaultEncoding("UTF-8");
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
        Map root = new HashMap();
        root.put("configuration", configuration);
        root.put("columnList", columns);
        writeSingleFile(cfg, root, "DaoImpl.ftl", 
        configuration.getProjectPath(), 
        configuration.getSqlMappingPackage().replace(".", "/"), 
        configuration.getDomainObjectName(), "DaoImpl.java",configuration.getOverwrite());
        writeSingleFile(cfg, root, "Dao.ftl", 
        configuration.getProjectPath(), 
        configuration.getSqlMappingPackage().replace(".", "/"), 
        configuration.getDomainObjectName(), "Dao.java",configuration.getOverwrite());
        writeSingleFile(cfg, root, "Meta.ftl", 
        configuration.getProjectPath(), 
        configuration.getJavaModelPackage().replace(".", "/"), 
        configuration.getDomainObjectName(), ".java",configuration.getOverwrite());
    }

    注意

    在测试中,Class.class.getClass().getResource("/").getPath();该方法可以获取项目根目录,但是在测试生成的Jar包时,该方法时效。因此在生成Jar包前需要把该行修改成new File("").getAbsolutePath();获取生成路径。

    项目结构

    项目结构

    配置文件范例

    generatorConfig.properties

    class.path.entry=src/test/resources/mysql-connector-java-5.1.38.jar
    driver.class=com.mysql.jdbc.Driver
    connection.url=jdbc:mysql://localhost:3307/work
    user.id=
    user.password=
    java.model.package=com.model
    sql.mapping.package=com.dao
    project=src
    table.name=holiday
    domain.object.name=Holiday

    运行命令范例

    java -jar JavaWebCodeGenerator.jar -configfile generatorConfig.properties -overwrite

    实例演示

    实例演示

    以上就是详解Java Web模板代码生成器的设计与实现的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:Java敏感信息加密处理的示例代码分享 下一篇:详解Spring框架注解的用法代码实例
    PHP编程就业班

    相关文章推荐

    • JAVA-5NIO之Selector• JAVA基础的相关介绍• 打造高性能Java应用需掌握的5大知识• Java开发中的23种设计模式详解• 浅析Java中的GC垃圾回收器的意义及与GC的交互

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网