package com.zzg.mybatis.generator.bridge; import com.zzg.mybatis.generator.model.DatabaseConfig; import com.zzg.mybatis.generator.model.DbType; import com.zzg.mybatis.generator.model.GeneratorConfig; import com.zzg.mybatis.generator.plugins.DbRemarksCommentGenerator; import com.zzg.mybatis.generator.util.ConfigHelper; import com.zzg.mybatis.generator.util.DbUtil; import org.apache.commons.lang3.StringUtils; import org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.api.ProgressCallback; import org.mybatis.generator.api.ShellCallback; import org.mybatis.generator.config.*; import org.mybatis.generator.internal.DefaultShellCallback; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * The bridge between GUI and the mybatis generator. All the operation to mybatis generator should proceed through this * class * <p> * Created by Owen on 6/30/16. */ public class MybatisGeneratorBridge { private static final Logger _LOG = LoggerFactory.getLogger(MybatisGeneratorBridge.class); private GeneratorConfig generatorConfig; private DatabaseConfig selectedDatabaseConfig; private ProgressCallback progressCallback; private List<IgnoredColumn> ignoredColumns; private List<ColumnOverride> columnOverrides; public MybatisGeneratorBridge() { init(); } private void init() { Configuration config = new Configuration(); Context context = new Context(ModelType.CONDITIONAL); context.addProperty("javaFileEncoding", "UTF-8"); config.addContext(context); } public void setGeneratorConfig(GeneratorConfig generatorConfig) { this.generatorConfig = generatorConfig; } public void setDatabaseConfig(DatabaseConfig databaseConfig) { this.selectedDatabaseConfig = databaseConfig; } public void generate() throws Exception { Configuration config = new Configuration(); String connectorLibPath = ConfigHelper.findConnectorLibPath(selectedDatabaseConfig.getDbType()); _LOG.info("connectorLibPath: {}", connectorLibPath); config.addClasspathEntry(connectorLibPath); Context context = new Context(ModelType.CONDITIONAL); config.addContext(context); // Table config TableConfiguration tableConfig = new TableConfiguration(context); tableConfig.setTableName(generatorConfig.getTableName()); tableConfig.setDomainObjectName(generatorConfig.getDomainObjectName()); //添加GeneratedKey主键生成 if (StringUtils.isNoneEmpty(generatorConfig.getGenerateKeys())) { tableConfig.setGeneratedKey(new GeneratedKey(generatorConfig.getGenerateKeys(), selectedDatabaseConfig.getDbType(), true, null)); } if (generatorConfig.getMapperName() != null) { tableConfig.setMapperName(generatorConfig.getMapperName()); } // add ignore columns if (ignoredColumns != null) { ignoredColumns.stream().forEach(ignoredColumn -> { tableConfig.addIgnoredColumn(ignoredColumn); }); } if (columnOverrides != null) { columnOverrides.stream().forEach(columnOverride -> { tableConfig.addColumnOverride(columnOverride); }); } if (generatorConfig.isUseActualColumnNames()) { tableConfig.addProperty("useActualColumnNames", "true"); } JDBCConnectionConfiguration jdbcConfig = new JDBCConnectionConfiguration(); jdbcConfig.setDriverClass(DbType.valueOf(selectedDatabaseConfig.getDbType()).getDriverClass()); jdbcConfig.setConnectionURL(DbUtil.getConnectionUrlWithSchema(selectedDatabaseConfig)); jdbcConfig.setUserId(selectedDatabaseConfig.getUsername()); jdbcConfig.setPassword(selectedDatabaseConfig.getPassword()); // java model JavaModelGeneratorConfiguration modelConfig = new JavaModelGeneratorConfiguration(); modelConfig.setTargetPackage(generatorConfig.getModelPackage()); modelConfig.setTargetProject(generatorConfig.getProjectFolder() + "/" + generatorConfig.getModelPackageTargetFolder()); // Mapper config SqlMapGeneratorConfiguration mapperConfig = new SqlMapGeneratorConfiguration(); mapperConfig.setTargetPackage(generatorConfig.getMappingXMLPackage()); mapperConfig.setTargetProject(generatorConfig.getProjectFolder() + "/" + generatorConfig.getMappingXMLTargetFolder()); // DAO JavaClientGeneratorConfiguration daoConfig = new JavaClientGeneratorConfiguration(); daoConfig.setConfigurationType("XMLMAPPER"); daoConfig.setTargetPackage(generatorConfig.getDaoPackage()); daoConfig.setTargetProject(generatorConfig.getProjectFolder() + "/" + generatorConfig.getDaoTargetFolder()); context.setId("myid"); context.addTableConfiguration(tableConfig); context.setJdbcConnectionConfiguration(jdbcConfig); context.setJdbcConnectionConfiguration(jdbcConfig); context.setJavaModelGeneratorConfiguration(modelConfig); context.setSqlMapGeneratorConfiguration(mapperConfig); context.setJavaClientGeneratorConfiguration(daoConfig); // Comment CommentGeneratorConfiguration commentConfig = new CommentGeneratorConfiguration(); commentConfig.setConfigurationType(DbRemarksCommentGenerator.class.getName()); if (generatorConfig.isComment()) { commentConfig.addProperty("columnRemarks", "true"); } if (generatorConfig.isAnnotation()) { commentConfig.addProperty("annotations", "true"); } context.setCommentGeneratorConfiguration(commentConfig); //实体添加序列化 PluginConfiguration serializablePluginConfiguration = new PluginConfiguration(); serializablePluginConfiguration.addProperty("type", "org.mybatis.generator.plugins.SerializablePlugin"); serializablePluginConfiguration.setConfigurationType("org.mybatis.generator.plugins.SerializablePlugin"); context.addPluginConfiguration(serializablePluginConfiguration); // limit/offset插件 if (generatorConfig.isOffsetLimit()) { PluginConfiguration pluginConfiguration = new PluginConfiguration(); pluginConfiguration.addProperty("type", "com.zzg.mybatis.generator.plugins.MySQLLimitPlugin"); pluginConfiguration.setConfigurationType("com.zzg.mybatis.generator.plugins.MySQLLimitPlugin"); context.addPluginConfiguration(pluginConfiguration); } context.setTargetRuntime("MyBatis3"); List<String> warnings = new ArrayList<>(); Set<String> fullyqualifiedTables = new HashSet<>(); Set<String> contexts = new HashSet<>(); ShellCallback shellCallback = new DefaultShellCallback(true); // override=true MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, shellCallback, warnings); myBatisGenerator.generate(progressCallback, contexts, fullyqualifiedTables); } public void setProgressCallback(ProgressCallback progressCallback) { this.progressCallback = progressCallback; } public void setIgnoredColumns(List<IgnoredColumn> ignoredColumns) { this.ignoredColumns = ignoredColumns; } public void setColumnOverrides(List<ColumnOverride> columnOverrides) { this.columnOverrides = columnOverrides; } }