Heim  >  Artikel  >  Java  >  Ausführliche Erläuterung des Designs und der Implementierung des Java Web Template Code Generators

Ausführliche Erläuterung des Designs und der Implementierung des Java Web Template Code Generators

黄舟
黄舟Original
2017-03-18 10:32:232328Durchsuche

Ursache

Im Projekt müssen viele Meta-, Dao- und Servicecodes basierend auf Datenbanktabellen geschrieben werden, und viele davon sind repetitiv und umständlich. Wenn daher ein Generator für Vorlagencode vorhanden ist, kann die Entwicklungseffizienz bis zu einem gewissen Grad verbessert werden.

Ziel

Konfigurierbarer Generator zum Generieren von Dao-, Meta- und Service-Layer-Vorlagencodes in Java-Webprojekten.

Code-Framework

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

Designidee

Das Projekt bezieht sich auf den Prozess der Codegenerierung mit dem Mybatis-Generator. Die spezifischen Schritte sind in die folgenden 5 Schritte unterteilt.

Logische Schritte

  1. Befehlszeile analysieren

  2. Die Konfigurationsdatei

  3. Datentabelleninformationen abrufen

  4. Konfigurationsinformationen generieren

  5. Datei generieren

Codedesign

Befehlsparsing-Klasse ShellRunner

Diese Klasse ist für das Parsen von Befehlszeilenbefehlen, das Parsen von Konfigurationsdateien und das Kapseln der erforderlichen Daten verantwortlich Daten zur Codegenerierungsklasse.

Die analysierbaren Befehle sind -config<a href="http://www.php.cn/wiki/1313.html" target="_blank">file<p></p></a> : Geben Sie den Pfad an, in dem sich die Konfigurationsdatei befindet, und -config<a href="http://www.php.cn/wiki/1313.html" target="_blank">file</a>: ob die Zieldatei neu geschrieben werden soll. -overwriteDie Konfigurationselemente der Konfigurationsdatei sind:

//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";

Codegenerierungsklasse CodeGenerator

Diese Klasse ist für die Verbindung zur Datenbank und verantwortlich Abfrage der Tabelleninformationen der Datentabelle, Zuordnung von SQL-Typen zu Java-Typen und Kapselung der erforderlichen Daten in der Dateigenerierungsklasse.

Class.forName(configuration.getDriverClass());
//获取数据库连接
Connection connection = DriverManager.getConnection(configuration.getConnectionURL(), 
configuration.getUserId(), 
configuration.getPassword());
DatabaseMetaData databaseMetaData = connection.getMetaData();
//获取表结构信息
ResultSet rs = databaseMetaData.getColumns("", "", configuration.getTableName(), "%");
Durch die obigen Codezeilen wurden die Tabelleninformationen der Zieldatentabelle in der rs-Variablen abgerufen. Der Kern der

-Methode besteht darin, die databaseMetaData.getColumns-Anweisung auszuführen. SELECT * FROM information_schema.COLUMNS WHERE TABLE_NAME="tableName"

In der Ergebnismenge sind für die nachfolgende Verarbeitung im Allgemeinen die folgenden Tabelleninformationsspalten erforderlich.

NULLABLE
Feld Beschreibung
DATA_TYPE Datentyp
COLUMN_SIZE Datenlänge
COLUMN_NANE Spaltenname
Ob ungleich Null zulässig ist
DECIMAL_DIGITS Dezimalstellen
BEMERKUNGEN Bemerkungen
COLUMN_DEF Standardwert
字段 描述
DATA_TYPE 数据类型
COLUMN_SIZE 数据长度
COLUMN_NANE 列名
NULLABLE 是否允许非空
DECIMAL_DIGITS 小数位数
REMARKS 备注
COLUMN_DEF 默认值
wandelt schließlich SQL-Informationen durch Typzuordnung (

) in JavaTypeResolver und Kamel-Case-Benennungskonvertierung (Map<integer jdbctypeinformation> typeMap</integer>) in StringUtils in Java-Informationen um. getCamelCaseString

Dateigenerierungsklasse FileGenerator

Diese Klasse kombiniert Daten über die

FreeMarkerVorlagen-Engine zu einer Zielcodedatei.

Die Hauptlogik lautet wie folgt:

/**
* @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());
}

Hinweis

Beim Testen

Diese Methode kann das Projektstammverzeichnis abrufen. aber beim Testen ist diese Methode effektiv, wenn ein Jar-Paket generiert wird. Daher müssen Sie diese Zeile vor dem Generieren des Jar-Pakets in Class.class.getClass().getResource("/").getPath(); ändern, um den Generierungspfad zu erhalten. new File("").getAbsolutePath();

Projektstruktur

Ausführliche Erläuterung des Designs und der Implementierung des Java Web Template Code Generators

Beispiel für eine Konfigurationsdatei

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
Beispiel für einen Befehl ausführen

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

Beispieldemonstration

Ausführliche Erläuterung des Designs und der Implementierung des Java Web Template Code Generators

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung des Designs und der Implementierung des Java Web Template Code Generators. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn