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
该类负责解析命令行的命令,解析配置文件并封装所需的数据给代码生成类。
可解析命令有-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 语句。
在结果集中,后续处理大致需要以下表信息列。
最后通过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. > 运行命令范例java -jar JavaWebCodeGenerator.jar -configfile generatorConfig.properties -overwritehttps://github.com/TedHacker/PracticeArea/tree/master/JavaWebCodeGenerator
相关文章
- java中高级面试题总结(全面)_java高级面试题大汇总
- Java邮件发送详解
- java分前端后端吗_Java Web属于前端还是后端
- java标识符与关键字_4、Java标识符和关键字
- 什么是java虚拟机(Java Virtual Machine)?
- java课程设计成绩管理系统_Java课程设计–学生成绩管理系统
- java jersey使用总结_jersey Java Jersey配置「建议收藏」
- 【说站】java中Comparators是什么
- 【说站】java throw和throws的区别
- 【说站】java条件运算符是什么
- JAVA静态内部类_java静态内部类实例化
- vscode配置java环境变量_配置Java
- java查找字符的方法_Java字符串查找(3种方法)
- java解释器虚拟机-Java代码如何运行在Java虚拟机中
- Java学习--Win11配置环境变量
- Java基础学习笔记七 Java基础语法之继承和抽象类详解编程语言
- Java HttpClient Basic Credential 认证详解编程语言
- 数据库写入Java实现MySQL数据库的写入操作(java向mysql)
- Java 调用 MySQL,编写数据库程序(java导入mysql)
- Java与Linux搭配,开发无限可能(java与linux)
- 策略Java操作Redis设置过期策略(redisjava过期)
- 部署Java开发下的Linux部署(java开发linux)
- Linux下Java命令的使用方法简介(linux下java命令)
- 学习Java编程,攻克Oracle难题(java学oracle)
- 客户端Java客户端快速关闭Redis连接(关闭redis的java)
- Java中Runnable和Thread的区别分析