成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java Web模板代碼生成器的設計與實現

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

起因

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

[[185958]]

目標

可配置生成Java Web項目中Dao、Meta、Service層模板代碼的生成器。

代碼框架

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

設計思路

項目參考Mybatis generator生成代碼的過程,具體步驟分為以下5步。

邏輯步驟

  1. 解析命令行
  2. 解析配置文件
  3. 獲取數據表信息
  4. 生成配置信息
  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"語句。

在結果集中,后續處理大致需要以下表信息列。

字段 描述
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();獲取生成路徑。

項目結構

[[185959]]

配置文件范例

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

責任編輯:張燕妮 來源: tedhacker.top
相關推薦

2011-08-16 10:17:12

XCode模版引擎XTemplate

2015-08-25 15:54:17

程序員代碼生成器

2021-07-23 11:24:54

Create Inc開源G代碼生成器

2023-05-17 16:02:00

CSS工具代碼生成器

2020-10-20 09:53:11

代碼IDEA生成器

2012-03-30 09:31:44

WEBCSS

2015-04-22 09:36:27

JAVA代碼生成器

2023-01-06 07:52:52

代碼生成器開發

2012-03-21 09:49:42

Java

2024-11-01 15:51:06

2022-07-04 10:40:35

Jinja2代碼生成器模板語言

2021-10-29 11:25:41

代碼編程語言Java

2021-12-10 09:45:19

生成器配置代碼

2016-01-08 10:55:31

PHP莫斯電碼生成器

2016-12-21 10:55:55

PHP莫斯電碼生成器

2022-10-21 14:23:59

CSS工具開發

2017-09-06 09:26:03

Python生成器協程

2010-06-12 09:51:07

Eclipse插件Java代碼生成器slave4j1.0.

2022-05-19 14:57:30

CSS代碼工具

2009-07-03 09:29:24

KeelKit
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美福利| 国产一区 | 成人影院在线 | 久久久久久综合 | 欧美精品黄 | 国产99精品 | 久久日韩精品 | www.天天操.com | 精品久久久久久国产 | 精品成人69xx.xyz | 久久久久久高潮国产精品视 | 欧美日韩在线免费观看 | 精品久久久久久久久久久久 | av播播 | 国产精品一区二区三区在线 | 成人综合一区二区 | 岛国av免费看 | 久久精品国产一区 | 91精品免费视频 | 久久久久久久久久久久一区二区 | 国产特一级黄色片 | 三级免费网 | 亚洲视频免费观看 | 日韩a | 99久久精品免费看国产高清 | 中文字幕精品一区二区三区精品 | 九九色九九| 毛片1 | 欧美国产精品一区二区三区 | 成人免费视频网站在线观看 | 激情av网站| 日本久久精品视频 | 国产成人精品一区二 | 日韩欧美在线播放 | 超碰在线人人 | 亚洲成人免费视频在线 | 日韩免费 | 成人毛片视频免费 | 日韩欧美在线观看视频 | 国产精品美女久久久免费 | 国产精品国产三级国产aⅴ无密码 |