javaweb模板_Java Web 模板代码生成器的设计与实现

5edaa224de298859435713d3a22892f2.png

a72a803097a0c40b7f469495ce19dd20.gif

阅读本文约需要5分钟

大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈)。上次老师跟大家分享了下Java中Synchronized底层实现的相关知识,今天跟大家分享Java Web 模板代码生成器的设计与实现的知识。
参考来源:http://www.codeceo.com/article/java-web-template-code-generator.htm

1、起因

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

3、代码框架

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

4、设计思路

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

逻辑步骤

  1. 解析命令行

  2. 解析配置文件

  3. 获取数据表信息

  4. 生成配置信息

  5. 生成文件

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";

6、 代码生成类 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中的类型映射

(MaptypeMap)StringUtils中的驼峰命名转换(getCamelCaseString)将SQL信息转换成Java信息。

7、 文件生成类 FileGenerator

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

主逻辑如下:

/*** @param configuration 封装的配置信息* @param columns       封装的数据表列信息* @throws IOException* @throws TemplateException*/public static void writeFile(Configuration configuration, List 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();获取生成路径。

8、项目结构

1cd9fcc9ea89d6427bf09778a9ce29e8.png

9、配置文件范例 generatorConfig.properties
class.path.entry=src/test/resources/mysql-connector-java-5.1.38.jardriver.class=com.mysql.jdbc.Driverconnection.url=jdbc:mysql://localhost:3307/workuser.id=user.password=java.model.package=com.modelsql.mapping.package=com.daoproject=srctable.name=holidaydomain.object.name=Holiday
10、运行命令范例
java -jar JavaWebCodeGenerator.jar -configfile generatorConfig.properties -overwrite
11、源代码 https://github.com/TedHacker/PracticeArea/tree/master/JavaWebCodeGenerator 今天就分享这么多,关于Java Web 模板代码生成器的设计与实现,你学会了多少?欢迎在留言区评论,对于有价值的留言,我们都会一一回复的。如果觉得文章对你有一丢丢帮助,请点右下角【在看】,让更多人看到该文章。 5edaa224de298859435713d3a22892f2.png 1b48aa582725b7885442d249c6af7387.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值