Maison > Java > javaDidacticiel > le corps du texte

Explication détaillée de la conception et de la mise en œuvre du générateur de code de modèle Web Java

黄舟
Libérer: 2017-03-18 10:32:23
original
2332 Les gens l'ont consulté

Cause

Dans le projet, de nombreux codes Meta, Dao et Service doivent être écrits sur la base de tables de base de données, et beaucoup d'entre eux sont répétitifs et fastidieux. Par conséquent, s'il existe un générateur pour le code du modèle, l'efficacité du développement peut être améliorée dans une certaine mesure.

Cible

Générateur configurable pour générer des codes de modèles de couches Dao, Meta et Service dans les projets Web Java.

Cadre de code

mvn archetype:generate 
-DgroupId=com.zju 
-DartifactId=JavaWebCodeGenerator 
-DarchetypeArtifactId=maven-archetype-webapp 
-DinteractiveMode=false 
-DarchetypeCatalog=internal
Copier après la connexion

Idée de conception

Le projet fait référence au processus de génération de code avec le générateur Mybatis. Les étapes spécifiques sont divisées en 5 étapes suivantes.

Étapes logiques

  1. Analyser la ligne de commande

  2. Analyser le fichier de configuration

  3. Obtenir des informations sur la table de données

  4. Générer des informations de configuration

  5. Générer un fichier

Conception de code

Classe d'analyse de commandes ShellRunner

Cette classe est responsable de l'analyse des commandes de ligne de commande, de l'analyse des fichiers de configuration et de l'encapsulation des éléments requis données vers la classe de génération de code.

Les commandes analysables sont -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> : Précisez le chemin où se trouve le fichier de configuration et -overwrite : s'il faut réécrire le fichier cible.

Les éléments de configuration du fichier de configuration sont :

//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";
Copier après la connexion

Classe de génération de code CodeGenerator

Cette classe est responsable de la connexion à la base de données et interrogeant les informations de la table de données, mappe les types SQL aux types Java et encapsule les données requises dans la classe de génération de fichiers.

Class.forName(configuration.getDriverClass());
//获取数据库连接
Connection connection = DriverManager.getConnection(configuration.getConnectionURL(), 
configuration.getUserId(), 
configuration.getPassword());
DatabaseMetaData databaseMetaData = connection.getMetaData();
//获取表结构信息
ResultSet rs = databaseMetaData.getColumns("", "", configuration.getTableName(), "%");
Copier après la connexion

Grâce aux lignes de code ci-dessus, les informations de la table de données cible ont été obtenues dans la variable rs. L'essence de la méthode

databaseMetaData.getColumns est d'exécuter l'instruction SELECT * FROM information_schema.COLUMNS WHERE TABLE_NAME="tableName".

Dans l'ensemble de résultats, le traitement ultérieur nécessite généralement les colonnes d'informations de tableau suivantes.

< td>NULLABLE< /table>

convertit enfin les informations SQL en informations Java via le mappage de types (JavaTypeResolver) en Map<Integer, JdbcTypeInformation> typeMap et la conversion de dénomination de cas de chameau (StringUtils) en getCamelCaseString.

Classe de génération de fichiers FileGenerator

Cette classe combine des données dans un fichier de code cible via le FreeMarkermoteur de modèles.

La logique principale est la suivante :

/**
* @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());
}
Copier après la connexion

Remarque

Lors des tests, Class.class.getClass().getResource("/").getPath();Cette méthode peut obtenir le répertoire racine du projet, mais en test, cette méthode est valide lorsque le package Jar est généré. Par conséquent, avant de générer le package Jar, vous devez modifier cette ligne en new File("").getAbsolutePath(); pour obtenir le chemin de génération.

Structure du projet

Explication détaillée de la conception et de la mise en œuvre du générateur de code de modèle Web Java

Exemple de fichier de configuration

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
Copier après la connexion

Exemple de commande d'exécution

java -jar JavaWebCodeGenerator.jar -configfile generatorConfig.properties -overwrite
Copier après la connexion

Exemple de démonstration

Explication détaillée de la conception et de la mise en œuvre du générateur de code de modèle Web Java

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
ChampDescription
DATA_TYPEType de données
字段描述
DATA_TYPE数据类型
COLUMN_SIZE数据长度
COLUMN_NANE列名
NULLABLE是否允许非空
DECIMAL_DIGITS小数位数
REMARKS备注
COLUMN_DEF默认值
COLUMN_SIZELongueur des données
COLUMN_NANENom de la colonne
Si les valeurs non nulles sont autorisées
DECIMAL_DIGITSChiffres décimaux
REMARQUESRemarques
COLUMN_DEFValeur par défaut