diff --git a/kernel-d-db/db-api/pom.xml b/kernel-d-db/db-api/pom.xml index 9687887fe..dd6333531 100644 --- a/kernel-d-db/db-api/pom.xml +++ b/kernel-d-db/db-api/pom.xml @@ -46,6 +46,14 @@ ${roses.version} + + + + cn.stylefeng.roses + ds-container-api + ${roses.version} + + diff --git a/kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/exception/enums/DatabaseExceptionEnum.java b/kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/exception/enums/DatabaseExceptionEnum.java index 604cf1567..20fd50ad3 100644 --- a/kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/exception/enums/DatabaseExceptionEnum.java +++ b/kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/exception/enums/DatabaseExceptionEnum.java @@ -58,7 +58,12 @@ public enum DatabaseExceptionEnum implements AbstractExceptionEnum { /** * sql执行错误 */ - SQL_EXEC_ERROR(RuleConstants.BUSINESS_ERROR_TYPE_CODE + DbConstants.DB_EXCEPTION_STEP_CODE + "04", "sql执行错误,具体信息:{}"); + SQL_EXEC_ERROR(RuleConstants.BUSINESS_ERROR_TYPE_CODE + DbConstants.DB_EXCEPTION_STEP_CODE + "04", "sql执行错误,具体信息:{}"), + + /** + * 查询所有库错误 + */ + DATABASE_LIST_ERROR(RuleConstants.BUSINESS_ERROR_TYPE_CODE + DbConstants.DB_EXCEPTION_STEP_CODE + "05", "查询所有库错误,具体信息:{}"); /** diff --git a/kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/sqladapter/database/GetDatabasesSql.java b/kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/sqladapter/database/GetDatabasesSql.java new file mode 100644 index 000000000..0cdaad828 --- /dev/null +++ b/kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/sqladapter/database/GetDatabasesSql.java @@ -0,0 +1,58 @@ +/* + * Copyright [2020-2030] [https://www.stylefeng.cn] + * + * 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. + * + * Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Guns源码头部的版权声明。 + * 3.请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns + * 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns + * 6.若您的项目无法满足以上几点,可申请商业授权 + */ +package cn.stylefeng.roses.kernel.db.api.sqladapter.database; + +import cn.stylefeng.roses.kernel.db.api.sqladapter.AbstractSql; +import lombok.Getter; + +/** + * 创建数据库的sql,可用在租户的创建 + * + * @author fengshuonan + * @date 2019-07-16-13:06 + */ +@Getter +public class GetDatabasesSql extends AbstractSql { + + @Override + protected String mysql() { + return "show databases;"; + } + + @Override + protected String sqlServer() { + return ""; + } + + @Override + protected String pgSql() { + return ""; + } + + @Override + protected String oracle() { + return ""; + } +} 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 543458918..0126f3f75 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 @@ -1,5 +1,6 @@ package cn.stylefeng.roses.kernel.db.api.util; +import cn.hutool.core.io.IoUtil; 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; @@ -7,8 +8,10 @@ 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.sqladapter.database.CreateDatabaseSql; +import cn.stylefeng.roses.kernel.db.api.sqladapter.database.GetDatabasesSql; import cn.stylefeng.roses.kernel.db.api.sqladapter.table.TableFieldListSql; import cn.stylefeng.roses.kernel.db.api.sqladapter.table.TableListSql; +import cn.stylefeng.roses.kernel.dsctn.api.constants.DatasourceContainerConstants; import lombok.extern.slf4j.Slf4j; import java.sql.Connection; @@ -27,6 +30,39 @@ import java.util.List; @Slf4j public class DatabaseUtil { + /** + * 获取数据库中的所有数据库列表 + * + * @author fengshuonan + * @date 2021/5/26 20:42 + */ + public static List getDatabases(DruidProperties druidProperties) { + Connection conn = null; + List databasesList = new ArrayList<>(); + try { + Class.forName(druidProperties.getDriverClassName()); + conn = DriverManager.getConnection( + druidProperties.getUrl(), druidProperties.getUsername(), druidProperties.getPassword()); + PreparedStatement preparedStatement = conn.prepareStatement(new GetDatabasesSql().getSql(druidProperties.getUrl())); + ResultSet resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + String database = resultSet.getString("database"); + if (StrUtil.isNotBlank(database)) { + if (StrUtil.startWith(database, DatasourceContainerConstants.TENANT_DB_PREFIX)) { + database = database.replaceAll(DatasourceContainerConstants.TENANT_DB_PREFIX, ""); + databasesList.add(database); + } + } + } + return databasesList; + } catch (Exception e) { + log.error("查询所有库错误!", e); + throw new DaoException(DatabaseExceptionEnum.DATABASE_LIST_ERROR, e.getMessage()); + } finally { + IoUtil.close(conn); + } + } + /** * 查询某个数据库连接的所有表 * @@ -35,9 +71,10 @@ public class DatabaseUtil { */ public static List selectTables(DruidProperties druidProperties) { List tables = new ArrayList<>(); + Connection conn = null; try { Class.forName(druidProperties.getDriverClassName()); - Connection conn = DriverManager.getConnection( + conn = DriverManager.getConnection( druidProperties.getUrl(), druidProperties.getUsername(), druidProperties.getPassword()); // 获取数据库名称 @@ -65,6 +102,8 @@ public class DatabaseUtil { } catch (Exception ex) { log.error("查询所有表错误!", ex); throw new DaoException(DatabaseExceptionEnum.TABLE_LIST_ERROR, ex.getMessage()); + } finally { + IoUtil.close(conn); } } @@ -76,9 +115,10 @@ public class DatabaseUtil { */ public static List getTableFields(DruidProperties druidProperties, String tableName) { ArrayList fieldList = new ArrayList<>(); + Connection conn = null; try { Class.forName(druidProperties.getDriverClassName()); - Connection conn = DriverManager.getConnection( + conn = DriverManager.getConnection( druidProperties.getUrl(), druidProperties.getUsername(), druidProperties.getPassword()); PreparedStatement preparedStatement = conn.prepareStatement(new TableFieldListSql().getSql(druidProperties.getUrl())); @@ -111,6 +151,8 @@ public class DatabaseUtil { } catch (Exception ex) { log.error("查询表的所有字段错误!", ex); throw new DaoException(DatabaseExceptionEnum.FIELD_GET_ERROR, ex.getMessage()); + } finally { + IoUtil.close(conn); } } @@ -121,9 +163,10 @@ public class DatabaseUtil { * @date 2021/5/19 10:39 */ public static void createDatabase(DruidProperties druidProperties, String databaseName) { + Connection conn = null; try { Class.forName(druidProperties.getDriverClassName()); - Connection conn = DriverManager.getConnection(druidProperties.getUrl(), druidProperties.getUsername(), druidProperties.getPassword()); + conn = DriverManager.getConnection(druidProperties.getUrl(), druidProperties.getUsername(), druidProperties.getPassword()); //创建sql String sql = new CreateDatabaseSql().getSql(druidProperties.getUrl()); @@ -137,6 +180,8 @@ public class DatabaseUtil { } catch (Exception ex) { log.error("执行sql出现问题!", ex); throw new DaoException(DatabaseExceptionEnum.CREATE_DATABASE_ERROR, ex.getMessage()); + } finally { + IoUtil.close(conn); } } diff --git a/kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/util/SqlRunUtil.java b/kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/util/SqlRunUtil.java index f9f4d1c26..7d6686000 100644 --- a/kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/util/SqlRunUtil.java +++ b/kernel-d-db/db-api/src/main/java/cn/stylefeng/roses/kernel/db/api/util/SqlRunUtil.java @@ -1,5 +1,6 @@ package cn.stylefeng.roses.kernel.db.api.util; +import cn.hutool.core.io.IoUtil; import cn.stylefeng.roses.kernel.db.api.exception.DaoException; import cn.stylefeng.roses.kernel.db.api.exception.enums.DatabaseExceptionEnum; import lombok.extern.slf4j.Slf4j; @@ -29,9 +30,10 @@ public class SqlRunUtil { * @date 2021/5/19 10:52 */ public static void runClassPathSql(String classpathFileName, String driverClassName, String url, String username, String password) { + Connection conn = null; try { Class.forName(driverClassName); - Connection conn = DriverManager.getConnection(url, username, password); + conn = DriverManager.getConnection(url, username, password); ClassPathResource classPathResource = new ClassPathResource(classpathFileName); EncodedResource encodedResource = new EncodedResource(classPathResource, "utf-8"); @@ -39,8 +41,9 @@ public class SqlRunUtil { } catch (Exception e) { log.error("执行sql错误!", e); throw new DaoException(DatabaseExceptionEnum.SQL_EXEC_ERROR, e.getMessage()); + } finally { + IoUtil.close(conn); } - } /** @@ -50,9 +53,10 @@ public class SqlRunUtil { * @date 2021/5/19 10:52 */ public static void runFileSystemSql(SqlSessionFactory sqlSessionFactory, String sqlPath) { + Connection conn = null; try { SqlSession sqlSession = sqlSessionFactory.openSession(); - Connection conn = sqlSession.getConnection(); + conn = sqlSession.getConnection(); FileSystemResource classPathResource = new FileSystemResource(sqlPath); EncodedResource encodedResource = new EncodedResource(classPathResource, "GBK"); @@ -60,6 +64,8 @@ public class SqlRunUtil { } catch (Exception e) { log.error("执行sql错误!", e); throw new DaoException(DatabaseExceptionEnum.SQL_EXEC_ERROR, e.getMessage()); + } finally { + IoUtil.close(conn); } } diff --git a/kernel-d-ds-container/ds-container-api/pom.xml b/kernel-d-ds-container/ds-container-api/pom.xml index 870570222..d95c46b5e 100644 --- a/kernel-d-ds-container/ds-container-api/pom.xml +++ b/kernel-d-ds-container/ds-container-api/pom.xml @@ -24,7 +24,6 @@ ${roses.version} - diff --git a/kernel-d-ds-container/ds-container-sdk/src/main/java/cn/stylefeng/roses/kernel/dsctn/persist/DataBaseInfoPersistence.java b/kernel-d-ds-container/ds-container-sdk/src/main/java/cn/stylefeng/roses/kernel/dsctn/persist/DataBaseInfoPersistence.java index ab7b6f720..473f50673 100644 --- a/kernel-d-ds-container/ds-container-sdk/src/main/java/cn/stylefeng/roses/kernel/dsctn/persist/DataBaseInfoPersistence.java +++ b/kernel-d-ds-container/ds-container-sdk/src/main/java/cn/stylefeng/roses/kernel/dsctn/persist/DataBaseInfoPersistence.java @@ -25,6 +25,7 @@ package cn.stylefeng.roses.kernel.dsctn.persist; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.StrUtil; import cn.stylefeng.roses.kernel.db.api.pojo.druid.DruidProperties; import cn.stylefeng.roses.kernel.dsctn.api.exception.DatasourceContainerException; @@ -66,9 +67,10 @@ public class DataBaseInfoPersistence { */ public Map getAllDataBaseInfo() { Map dataSourceList = new HashMap<>(16); + Connection conn = null; try { Class.forName(druidProperties.getDriverClassName()); - Connection conn = DriverManager.getConnection( + conn = DriverManager.getConnection( druidProperties.getUrl(), druidProperties.getUsername(), druidProperties.getPassword()); PreparedStatement preparedStatement = conn.prepareStatement(new DatabaseListSql().getSql(druidProperties.getUrl())); @@ -86,6 +88,8 @@ public class DataBaseInfoPersistence { log.error("查询数据源信息错误!", exception); String userTip = StrUtil.format(QUERY_DBS_DAO_ERROR.getUserTip(), exception.getMessage()); throw new DatasourceContainerException(QUERY_DBS_DAO_ERROR, userTip); + } finally { + IoUtil.close(conn); } } @@ -96,9 +100,10 @@ public class DataBaseInfoPersistence { * @date 2020/10/31 23:55 */ public void createMasterDatabaseInfo() { + Connection conn = null; try { Class.forName(druidProperties.getDriverClassName()); - Connection conn = DriverManager.getConnection( + conn = DriverManager.getConnection( druidProperties.getUrl(), druidProperties.getUsername(), druidProperties.getPassword()); PreparedStatement preparedStatement = conn.prepareStatement(new AddDatabaseInfoSql().getSql(druidProperties.getUrl())); @@ -119,6 +124,8 @@ public class DataBaseInfoPersistence { log.error("初始化master的databaseInfo信息错误!", exception); String userTip = StrUtil.format(INSERT_DBS_DAO_ERROR.getUserTip(), exception.getMessage()); throw new DatasourceContainerException(INSERT_DBS_DAO_ERROR, userTip); + } finally { + IoUtil.close(conn); } } @@ -129,9 +136,10 @@ public class DataBaseInfoPersistence { * @date 2020/10/31 23:55 */ public void deleteMasterDatabaseInfo() { + Connection conn = null; try { Class.forName(druidProperties.getDriverClassName()); - Connection conn = DriverManager.getConnection( + conn = DriverManager.getConnection( druidProperties.getUrl(), druidProperties.getUsername(), druidProperties.getPassword()); PreparedStatement preparedStatement = conn.prepareStatement(new DeleteDatabaseInfoSql().getSql(druidProperties.getUrl())); @@ -142,6 +150,8 @@ public class DataBaseInfoPersistence { log.info("删除master的databaseInfo信息失败!", exception); String userTip = StrUtil.format(DELETE_DBS_DAO_ERROR.getUserTip(), exception.getMessage()); throw new DatasourceContainerException(DELETE_DBS_DAO_ERROR, userTip); + } finally { + IoUtil.close(conn); } }