package mysql.uitl; import java.io.File; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import mysql.uitl.converts.DbType; import mysql.uitl.converts.QuerySQL; import mysql.uitl.converts.TableField; /** * <p> * 配置汇总 传递给文件生成工具 * </p> */ public class ConfigBuilder { /** * 模板路径配置信息 */ private final TemplateConfig template; /** * 数据库配置 */ private final DataSourceConfig dataSourceConfig; /** * SQL连接 */ private Connection connection; /** * SQL语句类型 */ private QuerySQL querySQL; private String superEntityClass; private String superMapperClass; /** * service超类定义 */ private String superServiceClass; private String superServiceImplClass; private String superControllerClass; /** * 数据库表信息 */ private List<TableInfo> tableInfoList; /** * 包配置详情 */ private Map<String, String> packageInfo; /** * 路径配置信息 */ private Map<String, String> pathInfo; /** * 策略配置 */ private StrategyConfig strategyConfig; /** * 全局配置信息 */ private GlobalConfig globalConfig; /** * <p> * 在构造器中处理配置 * </p> * * @param packageConfig 包配置 * @param dataSourceConfig 数据源配置 * @param strategyConfig 表配置 * @param template 模板配置 * @param globalConfig 全局配置 */ public ConfigBuilder(PackageConfig packageConfig, DataSourceConfig dataSourceConfig, StrategyConfig strategyConfig, TemplateConfig template, GlobalConfig globalConfig) { // 全局配置 if (null == globalConfig) { this.globalConfig = new GlobalConfig(); } else { this.globalConfig = globalConfig; } // 模板配置 if (null == template) { this.template = new TemplateConfig(); } else { this.template = template; } // 包配置 if (null == packageConfig) { handlerPackage(this.template, this.globalConfig.getOutputDir(), new PackageConfig()); } else { handlerPackage(this.template, this.globalConfig.getOutputDir(), packageConfig); } this.dataSourceConfig = dataSourceConfig; handlerDataSource(dataSourceConfig); // 策略配置 if (null == strategyConfig) { this.strategyConfig = new StrategyConfig(); } else { this.strategyConfig = strategyConfig; } handlerStrategy(this.strategyConfig); } // ************************ 曝露方法 BEGIN***************************** /** * <p> * 所有包配置信息 * </p> * * @return 包配置 */ public Map<String, String> getPackageInfo() { return packageInfo; } /** * <p> * 所有路径配置 * </p> * * @return 路径配置 */ public Map<String, String> getPathInfo() { return pathInfo; } public String getSuperEntityClass() { return superEntityClass; } public String getSuperMapperClass() { return superMapperClass; } /** * <p> * 获取超类定义 * </p> * * @return 完整超类名称 */ public String getSuperServiceClass() { return superServiceClass; } public String getSuperServiceImplClass() { return superServiceImplClass; } public String getSuperControllerClass() { return superControllerClass; } /** * <p> * 表信息 * </p> * * @return 所有表信息 */ public List<TableInfo> getTableInfoList() { return tableInfoList; } /** * <p> * 模板路径配置信息 * </p> * * @return 所以模板路径配置信息 */ public TemplateConfig getTemplate() { return template == null ? new TemplateConfig() : template; } // ****************************** 曝露方法 END********************************** /** * <p> * 处理包配置 * </p> * * @param template TemplateConfig * @param outputDir * @param config PackageConfig */ private void handlerPackage(TemplateConfig template, String outputDir, PackageConfig config) { packageInfo = new HashMap<>(); packageInfo.put(ConstVal.MODULENAME, config.getModuleName()); packageInfo.put(ConstVal.ENTITY, joinPackage(config.getParent(), config.getEntity())); packageInfo.put(ConstVal.MAPPER, joinPackage(config.getParent(), config.getMapper())); packageInfo.put(ConstVal.XML, joinPackage(config.getParent(), config.getXml())); packageInfo.put(ConstVal.SERIVCE, joinPackage(config.getParent(), config.getService())); packageInfo.put(ConstVal.SERVICEIMPL, joinPackage(config.getParent(), config.getServiceImpl())); packageInfo.put(ConstVal.CONTROLLER, joinPackage(config.getParent(), config.getController())); // 生成路径信息 pathInfo = new HashMap<>(); if (StringUtils.isNotEmpty(template.getEntity())) { pathInfo.put(ConstVal.ENTITY_PATH, joinPath(outputDir, packageInfo.get(ConstVal.ENTITY))); } if (StringUtils.isNotEmpty(template.getMapper())) { pathInfo.put(ConstVal.MAPPER_PATH, joinPath(outputDir, packageInfo.get(ConstVal.MAPPER))); } if (StringUtils.isNotEmpty(template.getXml())) { pathInfo.put(ConstVal.XML_PATH, joinPath(outputDir, packageInfo.get(ConstVal.XML))); } if (StringUtils.isNotEmpty(template.getService())) { pathInfo.put(ConstVal.SERIVCE_PATH, joinPath(outputDir, packageInfo.get(ConstVal.SERIVCE))); } if (StringUtils.isNotEmpty(template.getServiceImpl())) { pathInfo.put(ConstVal.SERVICEIMPL_PATH, joinPath(outputDir, packageInfo.get(ConstVal.SERVICEIMPL))); } if (StringUtils.isNotEmpty(template.getController())) { pathInfo.put(ConstVal.CONTROLLER_PATH, joinPath(outputDir, packageInfo.get(ConstVal.CONTROLLER))); } } /** * <p> * 处理数据源配置 * </p> * * @param config DataSourceConfig */ private void handlerDataSource(DataSourceConfig config) { connection = config.getConn(); querySQL = getQuerySQL(config.getDbType()); } /** * <p> * 处理数据库表 加载数据库表、列、注释相关数据集 * </p> * * @param config StrategyConfig */ private void handlerStrategy(StrategyConfig config) { processTypes(config); tableInfoList = getTablesInfo(config); } /** * <p> * 处理superClassName,IdClassType,IdStrategy配置 * </p> * * @param config 策略配置 */ private void processTypes(StrategyConfig config) { if (StringUtils.isEmpty(config.getSuperServiceClass())) { superServiceClass = ConstVal.SUPERD_SERVICE_CLASS; } else { superServiceClass = config.getSuperServiceClass(); } if (StringUtils.isEmpty(config.getSuperServiceImplClass())) { superServiceImplClass = ConstVal.SUPERD_SERVICEIMPL_CLASS; } else { superServiceImplClass = config.getSuperServiceImplClass(); } if (StringUtils.isEmpty(config.getSuperMapperClass())) { superMapperClass = ConstVal.SUPERD_MAPPER_CLASS; } else { superMapperClass = config.getSuperMapperClass(); } superEntityClass = config.getSuperEntityClass(); superControllerClass = config.getSuperControllerClass(); } /** * <p> * 处理表对应的类名称 * </P> * * @param tableList 表名称 * @param strategy 命名策略 * @param tablePrefix * @return 补充完整信息后的表 */ private List<TableInfo> processTable(List<TableInfo> tableList, NamingStrategy strategy, String[] tablePrefix) { for (TableInfo tableInfo : tableList) { tableInfo.setEntityName(strategyConfig, NamingStrategy.capitalFirst(processName(tableInfo.getName(), strategy, tablePrefix))); if (StringUtils.isNotEmpty(globalConfig.getMapperName())) { tableInfo.setMapperName(String.format(globalConfig.getMapperName(), tableInfo.getEntityName())); } else { tableInfo.setMapperName(tableInfo.getEntityName() + ConstVal.MAPPER); } if (StringUtils.isNotEmpty(globalConfig.getXmlName())) { tableInfo.setXmlName(String.format(globalConfig.getXmlName(), tableInfo.getEntityName())); } else { tableInfo.setXmlName(tableInfo.getEntityName() + ConstVal.MAPPER); } if (StringUtils.isNotEmpty(globalConfig.getServiceName())) { tableInfo.setServiceName(String.format(globalConfig.getServiceName(), tableInfo.getEntityName())); } else { tableInfo.setServiceName("I" + tableInfo.getEntityName() + ConstVal.SERIVCE); } if (StringUtils.isNotEmpty(globalConfig.getServiceImplName())) { tableInfo.setServiceImplName(String.format(globalConfig.getServiceImplName(), tableInfo.getEntityName())); } else { tableInfo.setServiceImplName(tableInfo.getEntityName() + ConstVal.SERVICEIMPL); } if (StringUtils.isNotEmpty(globalConfig.getControllerName())) { tableInfo.setControllerName(String.format(globalConfig.getControllerName(), tableInfo.getEntityName())); } else { tableInfo.setControllerName(tableInfo.getEntityName() + ConstVal.CONTROLLER); } } return tableList; } /** * <p> * 获取所有的数据库表信息 * </p> */ private List<TableInfo> getTablesInfo(StrategyConfig config) { boolean isInclude = (null != config.getInclude() && config.getInclude().length > 0); boolean isExclude = (null != config.getExclude() && config.getExclude().length > 0); if (isInclude && isExclude) { throw new RuntimeException("<strategy> 标签中 <include> 与 <exclude> 只能配置一项!"); } //所有的表信息 List<TableInfo> tableList = new ArrayList<>(); //需要反向生成或排除的表信息 List<TableInfo> includeTableList = new ArrayList<>(); List<TableInfo> excludeTableList = new ArrayList<>(); //不存在的表名 Set<String> notExistTables = new HashSet<>(); NamingStrategy strategy = config.getNaming(); PreparedStatement preparedStatement = null; try { String tableCommentsSql = querySQL.getTableCommentsSql(); if (QuerySQL.POSTGRE_SQL == querySQL) { tableCommentsSql = String.format(tableCommentsSql, dataSourceConfig.getSchemaname()); } preparedStatement = connection.prepareStatement(tableCommentsSql); ResultSet results = preparedStatement.executeQuery(); TableInfo tableInfo; while (results.next()) { String tableName = results.getString(querySQL.getTableName()); if (StringUtils.isNotEmpty(tableName)) { String tableComment = results.getString(querySQL.getTableComment()); tableInfo = new TableInfo(); tableInfo.setName(tableName); tableInfo.setComment(tableComment); if (isInclude) { for (String includeTab : config.getInclude()) { if (includeTab.equalsIgnoreCase(tableName)) { includeTableList.add(tableInfo); } else { notExistTables.add(includeTab); } } } else if (isExclude) { for (String excludeTab : config.getExclude()) { if (excludeTab.equalsIgnoreCase(tableName)) { excludeTableList.add(tableInfo); } else { notExistTables.add(excludeTab); } } } tableList.add(this.convertTableFields(tableInfo, strategy)); } else { System.err.println("当前数据库为空!!!"); } } // 将已经存在的表移除,获取配置中数据库不存在的表 for (TableInfo tabInfo : tableList) { notExistTables.remove(tabInfo.getName()); } if (notExistTables.size() > 0) { System.err.println("表 " + notExistTables + " 在数据库中不存在!!!"); } // 需要反向生成的表信息 if (isExclude) { tableList.removeAll(excludeTableList); includeTableList = tableList; } if (!isInclude && !isExclude) { includeTableList = tableList; } } catch (SQLException e) { e.printStackTrace(); } finally { // 释放资源 try { if (preparedStatement != null) { preparedStatement.close(); } if (connection != null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } return processTable(includeTableList, strategy, config.getTablePrefix()); } /** * <p> * 判断主键是否为identity,目前仅对mysql进行检查 * </p> * * @param results ResultSet * @return 主键是否为identity * @throws SQLException */ private boolean isKeyIdentity(ResultSet results) throws SQLException { if (QuerySQL.MYSQL == this.querySQL) { String extra = results.getString("Extra"); if ("auto_increment".equals(extra)) { return true; } } else if (QuerySQL.SQL_SERVER == this.querySQL) { int isIdentity = results.getInt("isIdentity"); return 1 == isIdentity; } return false; } /** * <p> * 将字段信息与表信息关联 * </p> * * @param tableInfo 表信息 * @param strategy 命名策略 * @return */ private TableInfo convertTableFields(TableInfo tableInfo, NamingStrategy strategy) { boolean haveId = false; List<TableField> fieldList = new ArrayList<>(); List<TableField> commonFieldList = new ArrayList<>(); try { PreparedStatement preparedStatement = connection.prepareStatement(String.format(querySQL.getTableFieldsSql(), tableInfo.getName())); ResultSet results = preparedStatement.executeQuery(); while (results.next()) { TableField field = new TableField(); String key = results.getString(querySQL.getFieldKey()); // 避免多重主键设置,目前只取第一个找到ID,并放到list中的索引为0的位置 boolean isId = StringUtils.isNotEmpty(key) && key.toUpperCase().equals("PRI"); // 处理ID if (isId && !haveId) { field.setKeyFlag(true); if (isKeyIdentity(results)) { field.setKeyIdentityFlag(true); } haveId = true; } else { field.setKeyFlag(false); } // 处理其它信息 field.setName(results.getString(querySQL.getFieldName())); field.setType(results.getString(querySQL.getFieldType())); field.setPropertyName(strategyConfig, processName(field.getName(), strategy)); field.setColumnType(dataSourceConfig.getTypeConvert().processTypeConvert(field.getType())); field.setComment(results.getString(querySQL.getFieldComment())); if (strategyConfig.includeSuperEntityColumns(field.getName())) { // 跳过公共字段 commonFieldList.add(field); continue; } // 填充逻辑判断 List<TableFill> tableFillList = this.getStrategyConfig().getTableFillList(); if (null != tableFillList) { for (TableFill tableFill : tableFillList) { if (tableFill.getFieldName().equals(field.getName())) { field.setFill(tableFill.getFieldFill().name()); break; } } } fieldList.add(field); } } catch (SQLException e) { System.err.println("SQL Exception:" + e.getMessage()); } tableInfo.setFields(fieldList); tableInfo.setCommonFields(commonFieldList); return tableInfo; } /** * <p> * 连接路径字符串 * </p> * * @param parentDir 路径常量字符串 * @param packageName 包名 * @return 连接后的路径 */ private String joinPath(String parentDir, String packageName) { if (StringUtils.isEmpty(parentDir)) { parentDir = System.getProperty(ConstVal.JAVA_TMPDIR); } if (!StringUtils.endsWith(parentDir, File.separator)) { parentDir += File.separator; } packageName = packageName.replaceAll("\\.", "\\" + File.separator); return parentDir + packageName; } /** * <p> * 连接父子包名 * </p> * * @param parent 父包名 * @param subPackage 子包名 * @return 连接后的包名 */ private String joinPackage(String parent, String subPackage) { if (StringUtils.isEmpty(parent)) { return subPackage; } return parent + "." + subPackage; } /** * <p> * 处理字段名称 * </p> * * @return 根据策略返回处理后的名称 */ private String processName(String name, NamingStrategy strategy) { return processName(name, strategy, null); } /** * <p> * 处理字段名称 * </p> * * @param name * @param strategy * @param tablePrefix * @return 根据策略返回处理后的名称 */ private String processName(String name, NamingStrategy strategy, String[] tablePrefix) { boolean removePrefix = false; if (tablePrefix != null && tablePrefix.length >= 1) { removePrefix = true; } String propertyName; if (removePrefix) { if (strategy == NamingStrategy.underline_to_camel) { // 删除前缀、下划线转驼峰 propertyName = NamingStrategy.removePrefixAndCamel(name, tablePrefix); } else { // 删除前缀 propertyName = NamingStrategy.removePrefix(name, tablePrefix); } } else if (strategy == NamingStrategy.underline_to_camel) { // 下划线转驼峰 propertyName = NamingStrategy.underlineToCamel(name); } else { // 不处理 propertyName = name; } return propertyName; } /** * 获取当前的SQL类型 * * @return DB类型 */ private QuerySQL getQuerySQL(DbType dbType) { for (QuerySQL qs : QuerySQL.values()) { if (qs.getDbType().equals(dbType.getValue())) { return qs; } } return QuerySQL.MYSQL; } public StrategyConfig getStrategyConfig() { return strategyConfig; } public ConfigBuilder setStrategyConfig(StrategyConfig strategyConfig) { this.strategyConfig = strategyConfig; return this; } public GlobalConfig getGlobalConfig() { return globalConfig; } public ConfigBuilder setGlobalConfig(GlobalConfig globalConfig) { this.globalConfig = globalConfig; return this; } }
最近下载更多
sunlea LV20
2023年2月23日
wubinbin LV11
2021年12月18日
yin出门买了吗了 LV9
2021年11月1日
xmz5351 LV1
2021年9月15日
hjc810794 LV8
2020年4月24日
710223431 LV2
2020年3月9日
houliukou LV38
2020年2月14日
gaochanghong LV14
2019年11月14日
0312wangchen LV26
2019年9月20日
一把手 LV1
2019年4月17日
最近浏览更多
zolscy LV12
4月24日
hyx666110 LV2
3月2日
3320151533 LV1
1月7日
WBelong LV8
2023年12月28日
1529860026 LV24
2023年6月1日
tianyuboy111 LV3
2023年5月20日
guviva LV6
2023年5月1日
李亮 LV19
2023年3月6日
sunlea LV20
2023年2月23日
dengjunjun LV15
2023年1月5日