ホームページ >Java >&#&チュートリアル >Java Webテンプレートコードジェネレーターの設計と実装の詳細な説明

Java Webテンプレートコードジェネレーターの設計と実装の詳細な説明

黄舟
黄舟オリジナル
2017-03-18 10:32:232362ブラウズ

原因

プロジェクトでは、データベース テーブルに基づいて多くの Meta、Dao、Service コードを記述する必要があり、その多くは反復的で面倒です。そのため、テンプレートコード用のジェネレーターがあれば、開発効率をある程度向上させることができます。

目標

Java Web プロジェクトで Dao、メタ、およびサービス層のテンプレート コードを生成するための構成可能なジェネレーター。

コードフレームワーク

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

デザインアイデア

プロジェクトとは、Mybatisジェネレーターでコードを生成するプロセスを指します。具体的な手順は次の5つのステップに分かれています。

論理ステップ

  1. コマンドラインを解析

  2. 設定ファイルを解析

  3. データテーブル情報を取得

  4. 設定情報を生成

  5. ファイルを生成

コード設計

コマンド解析クラス ShellRunner

このクラスは、コマンド ライン コマンドの解析、構成ファイルの解析、および必要なデータのコード生成クラスへのカプセル化を担当します。

解析可能なコマンドには、-config<a href="http://www.php.cn/wiki/1313.html" target="_blank">file<code>-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</integer>)和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(); が含まれます: 構成へのパスを指定しますfile と -overwrite: ターゲット ファイルを書き換えるかどうか。

設定ファイルの設定項目は次のとおりです:

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 Webテンプレートコードジェネレーターの設計と実装の詳細な説明コード生成クラス CodeGenerator

このクラスは、データベースへの接続、データ テーブルのテーブル情報のクエリ、SQL 型の Java 型へのマッピング、および必要なデータをファイル生成クラスに渡します。

java -jar JavaWebCodeGenerator.jar -configfile generatorConfig.properties -overwrite

上記のコード行により、対象のデータテーブルのテーブル情報が rs 変数に取得されました。

databaseMetaData.getColumns メソッドの本質は、SELECT * FROM information_schema.COLUMNS WHERE TABLE_NAME="tableName" ステートメントを実行することです。

結果セットでは、後続の処理では通常、次のテーブル情報列が必要です。

フィールド 説明
DATA_TYPE データ型
COLUMN_SIZE データ長
COLUMN_NANE 列名
NULLABLE 空以外が許可されるかどうか
DECIMAL_DIGITS 10 進数
REMARKS 備考
COLUMN_DEF デフォルト値

最後に、JavaTypeResolver の型マッピング (Map<integer jdbctypeinformation> typeMap</integer>) と、StringUtils のキャメル ケースの名前変換 (<code>getCamelCaseString) を使用します。 code>) は SQL 情報を Java 情報に変換します。 Java Webテンプレートコードジェネレーターの設計と実装の詳細な説明

🎜ファイル ジェネレーター🎜🎜🎜このクラスは、FreeMarkerテンプレート エンジン 🎜 データをオブジェクト コード ファイルに結合します。 🎜🎜主なロジックは次のとおりです: 🎜rrreee🎜🎜注🎜🎜🎜 テストでは、 Class.class.getClass().getResource("/").getPath(); このメソッドは次のことができます。プロジェクトのルート ディレクトリを取得しますが、生成された Jar パッケージをテストする場合、この方法は無効です。したがって、Jar パッケージを生成する前に、この行を new File("").getAbsolutePath(); に変更して生成パスを取得する必要があります。 🎜🎜プロジェクト構造🎜🎜🎜🎜🎜設定ファイルの例🎜🎜generatorConfig.properties🎜rrreee🎜コマンドの実行例🎜rrreee🎜🎜デモ例🎜🎜🎜🎜🎜

以上がJava Webテンプレートコードジェネレーターの設計と実装の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。