/** * Copyright (c) 2011-2017, James Zhan 詹波 (jfinal@126.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.jfinal.plugin.activerecord.generator; import java.util.List; import javax.sql.DataSource; import com.jfinal.plugin.activerecord.dialect.Dialect; /** * 生成器 * 1:生成时会强制覆盖 Base model、MappingKit、DataDictionary,建议不要修改三类文件,在数据库有变化重新生成一次便可 * 2:生成 Model 不会覆盖已经存在的文件,Model 通常会被人为修改和维护 * 3:MappingKit 文件默认会在生成 Model 文件的同时生成 * 4:DataDictionary 文件默认不会生成。只有在设置 setGenerateDataDictionary(true)后,会在生成 Model文件的同时生成 * 5:可以通过继承 BaseModelGenerator、ModelGenerator、MappingKitGenerator、DataDictionaryGenerator * 来创建自定义生成器,然后使用 Generator 的 setter 方法指定自定义生成器来生成 * 6:生成模板文字属性全部为 protected 可见性,方便自定义 Generator 生成符合。。。。 */ public class Generator { protected Dialect dialect = null; protected MetaBuilder metaBuilder; protected BaseModelGenerator baseModelGenerator; protected ModelGenerator modelGenerator; protected MappingKitGenerator mappingKitGenerator; protected DataDictionaryGenerator dataDictionaryGenerator; protected boolean generateDataDictionary = false; /** * 构造 Generator,生成 BaseModel、Model、MappingKit 三类文件,其中 MappingKit 输出目录与包名与 Model相同 * @param dataSource 数据源 * @param baseModelPackageName base model 包名 * @param baseModelOutputDir base mode 输出目录 * @param modelPackageName model 包名 * @param modelOutputDir model 输出目录 */ public Generator(DataSource dataSource, String baseModelPackageName, String baseModelOutputDir, String modelPackageName, String modelOutputDir) { this(dataSource, new BaseModelGenerator(baseModelPackageName, baseModelOutputDir), new ModelGenerator(modelPackageName, baseModelPackageName, modelOutputDir)); } /** * 构造 Generator,只生成 baseModel * @param dataSource 数据源 * @param baseModelPackageName base model 包名 * @param baseModelOutputDir base mode 输出目录 */ public Generator(DataSource dataSource, String baseModelPackageName, String baseModelOutputDir) { this(dataSource, new BaseModelGenerator(baseModelPackageName, baseModelOutputDir)); } public Generator(DataSource dataSource, BaseModelGenerator baseModelGenerator) { if (dataSource == null) { throw new IllegalArgumentException("dataSource can not be null."); } if (baseModelGenerator == null) { throw new IllegalArgumentException("baseModelGenerator can not be null."); } this.metaBuilder = new MetaBuilder(dataSource); this.baseModelGenerator = baseModelGenerator; this.modelGenerator = null; this.mappingKitGenerator = null; this.dataDictionaryGenerator = null; } /** * 使用指定 BaseModelGenerator、ModelGenerator 构造 Generator * 生成 BaseModel、Model、MappingKit 三类文件,其中 MappingKit 输出目录与包名与 Model相同 */ public Generator(DataSource dataSource, BaseModelGenerator baseModelGenerator, ModelGenerator modelGenerator) { if (dataSource == null) { throw new IllegalArgumentException("dataSource can not be null."); } if (baseModelGenerator == null) { throw new IllegalArgumentException("baseModelGenerator can not be null."); } if (modelGenerator == null) { throw new IllegalArgumentException("modelGenerator can not be null."); } this.metaBuilder = new MetaBuilder(dataSource); this.baseModelGenerator = baseModelGenerator; this.modelGenerator = modelGenerator; this.mappingKitGenerator = new MappingKitGenerator(modelGenerator.modelPackageName, modelGenerator.modelOutputDir); this.dataDictionaryGenerator = new DataDictionaryGenerator(dataSource, modelGenerator.modelOutputDir); } /** * 设置 MetaBuilder,便于扩展自定义 MetaBuilder */ public void setMetaBuilder(MetaBuilder metaBuilder) { if (metaBuilder != null) { this.metaBuilder = metaBuilder; } } public void setTypeMapping(TypeMapping typeMapping) { this.metaBuilder.setTypeMapping(typeMapping); } /** * 设置 MappingKitGenerator,便于扩展自定义 MappingKitGenerator */ public void setMappingKitGenerator(MappingKitGenerator mappingKitGenerator) { if (mappingKitGenerator != null) { this.mappingKitGenerator = mappingKitGenerator; } } /** * 设置 DataDictionaryGenerator,便于扩展自定义 DataDictionaryGenerator */ public void setDataDictionaryGenerator(DataDictionaryGenerator dataDictionaryGenerator) { if (dataDictionaryGenerator != null) { this.dataDictionaryGenerator = dataDictionaryGenerator; } } /** * 设置数据库方言,默认为 MysqlDialect */ public void setDialect(Dialect dialect) { this.dialect = dialect; } /** * 设置 BaseMode 是否生成链式 setter 方法 */ public void setGenerateChainSetter(boolean generateChainSetter) { baseModelGenerator.setGenerateChainSetter(generateChainSetter); } /** * 设置需要被移除的表名前缀,仅用于生成 modelName 与 baseModelName * 例如表名 "osc_account",移除前缀 "osc_" 后变为 "account" */ public void setRemovedTableNamePrefixes(String... removedTableNamePrefixes) { metaBuilder.setRemovedTableNamePrefixes(removedTableNamePrefixes); } /** * 添加不需要处理的数据表 */ public void addExcludedTable(String... excludedTables) { metaBuilder.addExcludedTable(excludedTables); } /** * 设置是否在 Model 中生成 dao 对象,默认生成 */ public void setGenerateDaoInModel(boolean generateDaoInModel) { if (modelGenerator != null) { modelGenerator.setGenerateDaoInModel(generateDaoInModel); } } /** * 设置是否生成数据字典 Dictionary 文件,默认不生成 */ public void setGenerateDataDictionary(boolean generateDataDictionary) { this.generateDataDictionary = generateDataDictionary; } /** * 设置 MappingKit 文件输出目录,默认与 modelOutputDir 相同, * 在设置此变量的同时需要设置 mappingKitPackageName */ public void setMappingKitOutputDir(String mappingKitOutputDir) { if (this.mappingKitGenerator != null) { this.mappingKitGenerator.setMappingKitOutputDir(mappingKitOutputDir); } } /** * 设置 MappingKit 文件包名,默认与 modelPackageName 相同, * 在设置此变的同时需要设置 mappingKitOutputDir */ public void setMappingKitPackageName(String mappingKitPackageName) { if (this.mappingKitGenerator != null) { this.mappingKitGenerator.setMappingKitPackageName(mappingKitPackageName); } } /** * 设置 MappingKit 类名,默认值为: "_MappingKit" */ public void setMappingKitClassName(String mappingKitClassName) { if (this.mappingKitGenerator != null) { this.mappingKitGenerator.setMappingKitClassName(mappingKitClassName); } } /** * 设置数据字典 DataDictionary 文件输出目录,默认与 modelOutputDir 相同 */ public void setDataDictionaryOutputDir(String dataDictionaryOutputDir) { if (this.dataDictionaryGenerator != null) { this.dataDictionaryGenerator.setDataDictionaryOutputDir(dataDictionaryOutputDir); } } /** * 设置数据字典 DataDictionary 文件输出目录,默认值为 "_DataDictionary.txt" */ public void setDataDictionaryFileName(String dataDictionaryFileName) { if (dataDictionaryGenerator != null) { dataDictionaryGenerator.setDataDictionaryFileName(dataDictionaryFileName); } } public void generate() { if (dialect != null) { metaBuilder.setDialect(dialect); } long start = System.currentTimeMillis(); List<TableMeta> tableMetas = metaBuilder.build(); if (tableMetas.size() == 0) { System.out.println("TableMeta 数量为 0,不生成任何文件"); return ; } baseModelGenerator.generate(tableMetas); if (modelGenerator != null) { modelGenerator.generate(tableMetas); } if (mappingKitGenerator != null) { mappingKitGenerator.generate(tableMetas); } if (dataDictionaryGenerator != null && generateDataDictionary) { dataDictionaryGenerator.generate(tableMetas); } long usedTime = (System.currentTimeMillis() - start) / 1000; System.out.println("Generate complete in " + usedTime + " seconds."); } }