JAVA程序实例 Java Web模板代码生成器的设计与实现
小职 2018-02-04 来源 :网络 阅读 814 评论 0

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

起因

JAVA程序实例之Java Web模板代码生成器的设计与实现。项目中需要根据数据库表写很多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();获取生成路径。


项目结构

JAVA程序实例 Java Web模板代码生成器的设计与实现


配置文件范例

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程序实例 Java Web模板代码生成器的设计与实现

源代码

https://github.com/TedHacker/PracticeArea/tree/master/JavaWebCodeGenerator


以上就是JAVA程序实例中Java Web模板代码生成器的设计与实现。关于此项目的实现你搞明白了嘛?更多精彩内容尽在职坐标Java频道!


本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved