From 3a56a63ee2aff4a7bdb8e2cdd80c337641ff9907 Mon Sep 17 00:00:00 2001 From: fengshuonan Date: Wed, 19 May 2021 11:22:19 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=907.0.4=E3=80=91=E6=95=B4=E7=90=86DbInit?= =?UTF-8?q?ializer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db/api/pojo/db/DatabaseInfoDTO.java | 34 ------------ .../kernel/db/api/util/DatabaseUtil.java | 52 +++++++++---------- kernel-d-db/db-sdk-init/pom.xml | 7 +++ .../db/init/actuator/DbInitializer.java | 49 +++++++---------- 4 files changed, 51 insertions(+), 91 deletions(-) delete mode 100644 kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/pojo/db/DatabaseInfoDTO.java diff --git a/kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/pojo/db/DatabaseInfoDTO.java b/kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/pojo/db/DatabaseInfoDTO.java deleted file mode 100644 index 81024fd72..000000000 --- a/kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/pojo/db/DatabaseInfoDTO.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.stylefeng.roses.kernel.db.api.pojo.db; - -import lombok.Data; - -/** - * 数据库信息的封装 - * - * @author fengshuonan - * @date 2021/5/19 10:37 - */ -@Data -public class DatabaseInfoDTO { - - /** - * jdbc的驱动类型 - */ - private String jdbcDriver; - - /** - * jdbc的url - */ - private String jdbcUrl; - - /** - * 数据库连接的账号 - */ - private String username; - - /** - * 数据库连接密码 - */ - private String password; - -} diff --git a/kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/util/DatabaseUtil.java b/kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/util/DatabaseUtil.java index 46574a06a..8602145eb 100644 --- a/kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/util/DatabaseUtil.java +++ b/kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/util/DatabaseUtil.java @@ -3,7 +3,6 @@ package cn.stylefeng.roses.kernel.db.api.util; import cn.hutool.core.util.StrUtil; import cn.stylefeng.roses.kernel.db.api.exception.DaoException; import cn.stylefeng.roses.kernel.db.api.exception.enums.DatabaseExceptionEnum; -import cn.stylefeng.roses.kernel.db.api.pojo.db.DatabaseInfoDTO; import cn.stylefeng.roses.kernel.db.api.pojo.db.TableFieldInfo; import cn.stylefeng.roses.kernel.db.api.pojo.db.TableInfo; import cn.stylefeng.roses.kernel.db.api.pojo.druid.DruidProperties; @@ -34,21 +33,21 @@ public class DatabaseUtil { * @author fengshuonan * @date 2021/5/19 10:35 */ - public static List selectTables(DatabaseInfoDTO dbInfo) { + public static List selectTables(DruidProperties druidProperties) { List tables = new ArrayList<>(); try { - Class.forName(dbInfo.getJdbcDriver()); + Class.forName(druidProperties.getDriverClassName()); Connection conn = DriverManager.getConnection( - dbInfo.getJdbcUrl(), dbInfo.getUsername(), dbInfo.getPassword()); + druidProperties.getUrl(), druidProperties.getUsername(), druidProperties.getPassword()); // 获取数据库名称 - String dbName = getDbName(dbInfo); + String dbName = getDbName(druidProperties); // 构造查询语句 - PreparedStatement preparedStatement = conn.prepareStatement(new TableListSql().getSql(dbInfo.getJdbcUrl())); + PreparedStatement preparedStatement = conn.prepareStatement(new TableListSql().getSql(druidProperties.getUrl())); // 拼接设置数据库名称 - if (!dbInfo.getJdbcUrl().contains("sqlserver") && !dbInfo.getJdbcUrl().contains("postgresql")) { + if (!druidProperties.getUrl().contains("sqlserver") && !druidProperties.getUrl().contains("postgresql")) { preparedStatement.setString(1, dbName); } @@ -73,25 +72,25 @@ public class DatabaseUtil { * 查询某个表的所有字段 * * @author fengshuonan - * @Date 2019-05-04 20:31 + * @date 2021/5/19 11:01 */ - public static List getTableFields(DatabaseInfoDTO dbInfo, String tableName) { + public static List getTableFields(DruidProperties druidProperties, String tableName) { ArrayList fieldList = new ArrayList<>(); try { - Class.forName(dbInfo.getJdbcDriver()); + Class.forName(druidProperties.getDriverClassName()); Connection conn = DriverManager.getConnection( - dbInfo.getJdbcUrl(), dbInfo.getUsername(), dbInfo.getPassword()); + druidProperties.getUrl(), druidProperties.getUsername(), druidProperties.getPassword()); - PreparedStatement preparedStatement = conn.prepareStatement(new TableFieldListSql().getSql(dbInfo.getJdbcUrl())); + PreparedStatement preparedStatement = conn.prepareStatement(new TableFieldListSql().getSql(druidProperties.getUrl())); - if (dbInfo.getJdbcUrl().contains("oracle")) { + if (druidProperties.getUrl().contains("oracle")) { preparedStatement.setString(1, tableName); - } else if (dbInfo.getJdbcUrl().contains("postgresql")) { + } else if (druidProperties.getUrl().contains("postgresql")) { preparedStatement.setString(1, tableName); - } else if (dbInfo.getJdbcUrl().contains("sqlserver")) { + } else if (druidProperties.getUrl().contains("sqlserver")) { preparedStatement.setString(1, tableName); } else { - String dbName = getDbName(dbInfo); + String dbName = getDbName(druidProperties); preparedStatement.setString(1, tableName); preparedStatement.setString(2, dbName); } @@ -147,32 +146,33 @@ public class DatabaseUtil { * @author fengshuonan * @date 2021/5/19 10:39 */ - private static String getDbName(DatabaseInfoDTO dbInfo) { + private static String getDbName(DruidProperties druidProperties) { - if (dbInfo.getJdbcUrl().contains("oracle")) { + if (druidProperties.getUrl().contains("oracle")) { // 如果是oracle,直接返回username - return dbInfo.getUsername(); + return druidProperties.getUsername(); - } else if (dbInfo.getJdbcUrl().contains("postgresql")) { + } else if (druidProperties.getUrl().contains("postgresql")) { // postgresql,直接返回最后一个/后边的字符 - int first = dbInfo.getJdbcUrl().lastIndexOf("/") + 1; - return dbInfo.getJdbcUrl().substring(first); + int first = druidProperties.getUrl().lastIndexOf("/") + 1; + return druidProperties.getUrl().substring(first); - } else if (dbInfo.getJdbcUrl().contains("sqlserver")) { + } else if (druidProperties.getUrl().contains("sqlserver")) { // sqlserver,直接返回最后一个=后边的字符 - int first = dbInfo.getJdbcUrl().lastIndexOf("=") + 1; - return dbInfo.getJdbcUrl().substring(first); + int first = druidProperties.getUrl().lastIndexOf("=") + 1; + return druidProperties.getUrl().substring(first); } else { // mysql,返回/和?之间的字符 - String jdbcUrl = dbInfo.getJdbcUrl(); + String jdbcUrl = druidProperties.getUrl(); int first = jdbcUrl.lastIndexOf("/") + 1; int last = jdbcUrl.indexOf("?"); return jdbcUrl.substring(first, last); } } + } diff --git a/kernel-d-db/db-sdk-init/pom.xml b/kernel-d-db/db-sdk-init/pom.xml index c7b9f5dfe..5736a5c8e 100644 --- a/kernel-d-db/db-sdk-init/pom.xml +++ b/kernel-d-db/db-sdk-init/pom.xml @@ -32,5 +32,12 @@ ${roses.version} + + + cn.stylefeng.roses + ds-container-api + ${roses.version} + + diff --git a/kernel-d-db/db-sdk-init/src/main/java/cn/stylefeng/roses/kernel/db/init/actuator/DbInitializer.java b/kernel-d-db/db-sdk-init/src/main/java/cn/stylefeng/roses/kernel/db/init/actuator/DbInitializer.java index 39844b36a..1b670f61a 100644 --- a/kernel-d-db/db-sdk-init/src/main/java/cn/stylefeng/roses/kernel/db/init/actuator/DbInitializer.java +++ b/kernel-d-db/db-sdk-init/src/main/java/cn/stylefeng/roses/kernel/db/init/actuator/DbInitializer.java @@ -29,6 +29,10 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; import cn.stylefeng.roses.kernel.db.api.exception.enums.DbInitEnum; +import cn.stylefeng.roses.kernel.db.api.pojo.db.TableFieldInfo; +import cn.stylefeng.roses.kernel.db.api.pojo.db.TableInfo; +import cn.stylefeng.roses.kernel.db.api.pojo.druid.DruidProperties; +import cn.stylefeng.roses.kernel.db.api.util.DatabaseUtil; import cn.stylefeng.roses.kernel.db.init.util.SqlExe; import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException; import com.alibaba.fastjson.JSON; @@ -36,10 +40,10 @@ import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import javax.annotation.Resource; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; -import java.util.Map; /** @@ -66,6 +70,9 @@ public abstract class DbInitializer { this.fieldValidatorExceptionFlag = fieldValidatorExceptionFlag; } + @Resource + private DruidProperties druidProperties; + /** * 初始化数据库 * @@ -89,7 +96,7 @@ public abstract class DbInitializer { */ private void initTable() { - //校验参数 + // 校验参数 String tableName = this.getTableName(); String tableInitSql = this.getTableInitSql(); if (ObjectUtil.isEmpty(tableName) || ObjectUtil.isEmpty(tableInitSql)) { @@ -98,16 +105,17 @@ public abstract class DbInitializer { } } - //列出数据库中所有的表 - List> tables = SqlExe.selectList("SHOW TABLES"); + // 列出数据库中所有的表 + List tableInfos = DatabaseUtil.selectTables(druidProperties); boolean haveSmsTableFlag = false; - for (Map tableInfo : tables) { - if (tableInfo.containsValue(tableName.toUpperCase()) || tableInfo.containsValue(tableName.toLowerCase())) { + for (TableInfo tableInfo : tableInfos) { + if (tableInfo.getTableName().equalsIgnoreCase(tableName)) { haveSmsTableFlag = true; + break; } } - //判断数据库中是否有这张表,如果没有就初始化 + // 判断数据库中是否有这张表,如果没有就初始化 if (!haveSmsTableFlag) { SqlExe.update(tableInitSql); log.info("初始化" + getTableName() + "成功!"); @@ -123,16 +131,8 @@ public abstract class DbInitializer { */ private void fieldsValidate() { - //校验参数 - String sql = this.showColumnsSql(); - if (ObjectUtil.isEmpty(sql)) { - if (fieldValidatorExceptionFlag) { - throw new ServiceException(DbInitEnum.INIT_TABLE_EMPTY_PARAMS); - } - } - //检查数据库中的字段,是否和实体字段一致 - List> tableFields = SqlExe.selectList(sql); + List tableFields = DatabaseUtil.getTableFields(druidProperties, getTableName()); if (tableFields != null && !tableFields.isEmpty()) { //用于保存实体中不存在的字段的名称集合 @@ -140,11 +140,8 @@ public abstract class DbInitializer { //反射获取字段的所有字段名称 List classFields = this.getClassFields(); - for (Map tableField : tableFields) { - String fieldName = (String) tableField.get("COLUMN_NAME"); - if (fieldName == null) { - fieldName = (String) tableField.get("Field"); - } + for (TableFieldInfo tableField : tableFields) { + String fieldName = tableField.getColumnName(); if (!classFields.contains(fieldName.toLowerCase())) { fieldsNotInClass.add(fieldName); } @@ -185,16 +182,6 @@ public abstract class DbInitializer { return filedNamesUnderlineCase; } - /** - * 获取表的字段 - * - * @author stylefeng - * @date 2018/7/29 22:49 - */ - private String showColumnsSql() { - return "SHOW COLUMNS FROM " + this.getTableName(); - } - /** * 获取表的初始化语句 *