新聞中心
起因
項目中需要根據(jù)數(shù)據(jù)庫表寫很多Meta、Dao、Service代碼,其中很多代碼都是重復而繁瑣的。因此如果有一個模板代碼的生成器,就可以一定程度提高開發(fā)效率。

創(chuàng)新互聯(lián)建站專注于武陟企業(yè)網站建設,成都響應式網站建設公司,成都做商城網站。武陟網站建設公司,為武陟等地區(qū)提供建站服務。全流程按需定制,專業(yè)設計,全程項目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務
目標
可配置生成Java Web項目中Dao、Meta、Service層模板代碼的生成器。
代碼框架
mvn archetype:generate -DgroupId=com.zju -DartifactId=JavaWebCodeGenerator -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false -DarchetypeCatalog=internal
設計思路
項目參考Mybatis generator生成代碼的過程,具體步驟分為以下5步。
邏輯步驟
- 解析命令行
- 解析配置文件
- 獲取數(shù)據(jù)表信息
- 生成配置信息
- 生成文件
代碼設計
命令解析類 ShellRunner
該類負責解析命令行的命令,解析配置文件并封裝所需的數(shù)據(jù)給代碼生成類。
可解析命令有-configfile:指定配置文件所在路徑和-overwrite:是否重寫目標文件。
配置文件的配置項有:
//Java SQL 驅動所在路徑(暫未使用) private static final String CLASS_PATH_ENTRY = "class.path.entry"; //Java 驅動類型(暫未使用) private static final String DRIVER_CLASS = "driver.class"; //數(shù)據(jù)庫地址 private static final String CONNECTION_URL = "connection.url"; //數(shù)據(jù)庫用戶名 private static final String USER_ID = "user.id"; //數(shù)據(jù)庫密碼 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"; //數(shù)據(jù)表名 private static final String TABLE_NAME = "table.name"; //模型名稱 private static final String DOMAIN_OBJECT_NAME = "domain.object.name";
代碼生成類 CodeGenerator
該類負責連接數(shù)據(jù)庫,查詢數(shù)據(jù)表的表信息,將SQL類型映射成Java類型并封裝所需的數(shù)據(jù)給文件生成類。
Class.forName(configuration.getDriverClass());
//獲取數(shù)據(jù)庫連接
Connection connection = DriverManager.getConnection(configuration.getConnectionURL(), configuration.getUserId(), configuration.getPassword());
DatabaseMetaData databaseMetaData = connection.getMetaData();
//獲取表結構信息
ResultSet rs = databaseMetaData.getColumns("", "", configuration.getTableName(), "%");通過以上幾行代碼,rs變量中已經獲得目標數(shù)據(jù)表的表信息。
databaseMetaData.getColumns方法的實質是執(zhí)行了SELECT * FROM information_schema.COLUMNS WHERE TABLE_NAME="tableName"語句。
在結果集中,后續(xù)處理大致需要以下表信息列。
| 字段 | 描述 |
|---|---|
| DATA_TYPE | 數(shù)據(jù)類型 |
| COLUMN_SIZE | 數(shù)據(jù)長度 |
| COLUMN_NANE | 列名 |
| NULLABLE | 是否允許非空 |
| DECIMAL_DIGITS | 小數(shù)位數(shù) |
| REMARKS | 備注 |
| COLUMN_DEF | 默認值 |
最后通過JavaTypeResolver中的類型映射(Map)和StringUtils中的駝峰命名轉換(getCamelCaseString)將SQL信息轉換成Java信息。
文件生成類 FileGenerator
該類通過FreeMarker模板引擎組合數(shù)據(jù)成目標代碼文件。
主邏輯如下:
/** * @param configuration 封裝的配置信息 * @param columns 封裝的數(shù)據(jù)表列信息 * @throws IOException * @throws TemplateException */ public static void writeFile(Configuration configuration, Listcolumns) throws IOException, TemplateException { File r=new File(""); //測試環(huán)境獲取項目根目錄路徑 //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
實例演示
源代碼
https://github.com/TedHacker/PracticeArea/tree/master/JavaWebCodeGenerator
分享文章:JavaWeb模板代碼生成器的設計與實現(xiàn)
文章地址:http://m.5511xx.com/article/djgeppi.html


咨詢
建站咨詢
