详解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步。
逻辑步骤
解析命令行
解析配置文件
获取数据表信息
生成配置信息
生成文件
代码设计
命令解析类 ShellRunner
该类负责解析命令行的命令,解析配置文件并封装所需的数据给代码生成类。
可解析命令有-config<a href="http://www.php.cn/wiki/1313.html" target="_blank">file</a>
:指定配置文件所在路径和-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中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

经过实际测试,AI证件照生成器表现出色,其强大的功能令人惊叹,确实不需要再费心去拍照了!本句话的重写如下:使用触站AI软件(版权和解释权归触站AI所有,仅用于展示生成效果)素描模式:无论是在日常工作还是商务办公场合,职业形象都至关重要。而一张精美的证件照能够提升个人的职业形象。通过AI生成的证件照不仅符合传统照片标准,还能够还原个人独特的面部特征。AI技术能够智能识别面部轮廓、肤色、光线等各种细节,生成最适合的证件照。不论是颜值还是气质,都能够完美展现,给人留下深刻的第一印象AI一键生成证件照的

如何使用Java编写一个简单的学生成绩报表生成器?学生成绩报表生成器是一个可以帮助老师或教育者快速生成学生成绩报告的工具。本文将介绍如何使用Java编写一个简单的学生成绩报表生成器。首先,我们需要定义学生对象和学生成绩对象。学生对象包含学生的姓名、学号等基本信息,而学生成绩对象则包含学生的科目成绩和平均成绩等信息。以下是一个简单的学生对象的定义:public

如果您渴望找到顶尖的免费AI动画艺术生成器,您可以结束搜索了。动漫艺术世界几十年来一直以其独特的角色设计、迷人的色彩和引人入胜的情节吸引着观众。不过,创作动漫艺术需要天赋、技能和耗费大量时间。然而,随着人工智能(AI)的不断发展,现在你可以借助最佳的免费AI动画艺术生成器,无需深入了解复杂技术,就能探索动漫艺术的世界。这将为你释放创造力提供新的可能性。什么是人工智能动漫艺术生成器?AI动画艺术生成器利用复杂的算法和机器学习技术,分析广泛的动画作品数据库。通过这些算法,系统学习并识别不同动漫风格的

PHP7中的生成器:如何高效地处理大规模数据和节省内存?概述:在大规模数据处理和节省内存方面,PHP7引入了生成器(Generators)作为一种强大的工具。生成器是PHP语言中一类特殊的函数,与普通函数不同的是,生成器可以暂停执行并返回中间结果,而不是将所有结果一次性返回。这使得生成器非常适用于处理大批量数据,降低了内存的使用和提高了处理效率。本文将介绍生

如何通过PHP编写一个简单的二维码生成器二维码在现代社会中已经变得非常常见,它能够快速传递信息,提升用户体验。在本文中,我将向大家介绍如何使用PHP编写一个简单的二维码生成器。一、安装必要的工具和库在开始之前,我们需要确保已经安装以下工具和库:PHP:确保已经安装了PHP的最新版本,可以通过运行php-v命令来查看当前PHP的版本。Composer:C

PHP7中引入了生成器(Generator)这一概念,它提供了一种高效地处理大量数据和延迟加载的方法。本文将从概念和原理入手,结合具体代码示例,介绍PHP7中生成器的使用方法和优势。生成器是一种特殊的函数,它不是一次性地将所有数据返回,而是按需生成数据。当函数执行到yield语句时,会将当前生成的值返回,并且函数的状态会被保存。下一次调用生成器函数时,函数会

ChatGPT可以联网后,OpenAI还火速介绍了一款代码生成器,在这个插件的加持下,ChatGPT甚至可以自己生成机器学习模型了。 上周五,OpenAI刚刚宣布了惊爆的消息,ChatGPT可以联网,接入第三方插件了!而除了第三方插件,OpenAI也介绍了一款自家的插件「代码解释器」,并给出了几个特别的用例:解决定量和定性的数学问题;进行数据分析和可视化;快速转换文件格式。此外,Greg Brockman演示了ChatGPT还可以对上传视频文件进行处理。而一位叫Andrew Mayne的畅销作

Python中的迭代器和生成器的区别是什么?在Python编程中,迭代器(iterator)和生成器(generator)都是用于处理可迭代对象的工具。它们两者都可以用于遍历数据,但是在实现上却有一些不同之处。迭代器是一个对象,它实现了迭代器协议(iteratorprotocol)。迭代器对象需要包含两个方法:__iter__()和__next__()。其
