起因项目需要编写大量基于数据库表的Meta、Dao、Service代码,其中很多代码重复且繁琐。因此,如果有模板代码生成器,可以在一定程度上提高开发效率。目标可以配置为生成JavaWeb项目中的Dao、Meta和服务层模板代码的生成器。代码框架mvnarchetype:generate-DgroupId=com.zju-DartifactId=JavaWebCodeGenerator-DarchetypeArtifactId=maven-archetype-webapp-DinteractiveMode=false-DarchetypeCatalog=internal设计思路项目是指Mybatis生成器生成代码的过程。具体步骤分为以下5个步骤。逻辑步骤解析命令行解析配置文件获取数据表信息生成配置信息生成文件代码设计命令解析类ShellRunner该类负责解析命令行命令,解析配置文件,并将需要的数据封装到代码生成类中。可解析的命令包括-configfile:指定配置文件所在路径和-overwrite:是否重写目标文件。配置文件的配置项为://JavaSQL驱动路径(未使用)privatestaticfinalStringCLASS_PATH_ENTRY="class.path.entry";//Java驱动类型(未使用)privatestaticfinalStringDRIVER_CLASS="driver.class";//数据库地址privatestaticfinalStringCONNECTION_URL="connection.url";//数据库用户名privatestaticfinalStringUSER_ID="user.id";//数据库密码privatestaticfinalStringUSER_PASSWORD="user.password";//模型生成地址privatestaticfinalStringJAVA_MODEL_PACKAGE="java.model.package";//SQL生成地址privatestaticfinalStringSQL_MAPPING_PACKAGE="sql.mapping.package";//项目地址privatestaticfinalStringPROJECT="project";//数据表名privatestaticfinalStringTABLE_NAME="table.name";//模型名privatestaticfinalStringDOMAIN_OBJECT_NAME="domain.object.name";代码生成类CodeGenerator该类负责连接数据库,查询数据表的表信息,将SQL类型映射为Java类型并将需要的数据封装到文件生成类中。Class.forName(configuration.getDriverClass());//获取数据库连接Connectionconnection=DriverManager.getConnection(configuration.getConnectionURL(),configuration.getUserId(),configuration.getPassword());DatabaseMetaDatadatabaseMetaData=connection.getMetaData();//获取表结构信息ResultSetrs=databaseMetaData.getColumns("","",configuration.getTableName(),"%");通过以上几行代码,已经在rs变量中获取到了目标数据表的表信息。databaseMetaData.getColumns方法的本质是执行SELECT*FROMinformation_schema.COLUMNSWHERETABLE_NAME="tableName"语句。在结果集中,后续处理大致需要以下信息列。字段描述DATA_TYPE数据类型COLUMN_SIZE数据长度COLUMN_NANE列名NULLABLE是否允许非空DECIMAL_DIGITS十进制数字REMARKS备注COLUMN_DEF默认值最终通过JavaTypeResolver(MaptypeMap)中的类型映射和驼峰命名转换inStringUtils(getCamelCaseString)将SQL信息转换为Java信息。文件生成类FileGenerator该类通过FreeMarker模板引擎将数据组合成目标代码文件。主要逻辑如下:/***@paramconfiguration封装配置信息*@paramcolumns封装数据表列信息*@throwsIOException*@throwsTemplateException*/publicstaticvoidwriteFile(Configurationconfiguration,Listcolumns)抛出IOException,TemplateException{Filer=newFile("");//测试环境获取项目根目录路径//Stringpath=Class.class.getClass().getResource("/").getPath();//Jar包获取根目录路径Stringpath=r.getAbsolutePath();//System.out.println("路径:"+路径);配置cfg=newConfiguration();cfg.setDirectoryForTemplateLoading(新文件(路径+“/ftl”));//需要文件夹的绝对路径cfg.setDefaultEncoding("UTF-8");cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);地图根=newHashMap();root.put("配置",配置);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包时,该方法是时效性的,所以需要将这一行修改为newFile("").getAbsolutePath();获取生成的路径。示例项目结构配置文件generatorConfig.propertiesclass.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=假日运行命令示例java-jarJavaWebCodeGenerator.jar-配置文件生成器Config.properties-覆盖示例演示源代码https://github.com/TedHacker/PracticeArea/tree/master/JavaWebCodeGenerator