diff --git a/qiaoba-commons/qiaoba-common-datasource/pom.xml b/qiaoba-commons/qiaoba-common-datasource/pom.xml index d2a1702..3b9836b 100644 --- a/qiaoba-commons/qiaoba-common-datasource/pom.xml +++ b/qiaoba-commons/qiaoba-common-datasource/pom.xml @@ -27,6 +27,11 @@ org.postgresql postgresql + + com.oracle.database.jdbc + ojdbc6 + 11.2.0.4 + com.baomidou diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/handlers/schema/MysqlSchemaHandler.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/handlers/schema/MysqlSchemaHandler.java new file mode 100644 index 0000000..f55dafc --- /dev/null +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/handlers/schema/MysqlSchemaHandler.java @@ -0,0 +1,40 @@ +package com.qiaoba.common.database.handlers.schema; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; +import com.qiaoba.common.base.context.BaseContext; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Statement; + +/** + * MysqlSchemaHandler + * + * @author ailanyin + * @version 1.0 + * @since 2023/6/20 9:25 + */ +@Component +public class MysqlSchemaHandler implements SchemaHandler { + + @Value("${spring.application.name}") + private String baseDatabase; + + @Override + public void setSchema(Connection conn) { + // eg: use qiaoba-1; + String sql = StrUtil.format("use `{}-{}`;", baseDatabase, BaseContext.getTenantId()); + Statement statement = null; + try { + statement = conn.createStatement(); + statement.execute(sql); + } catch (SQLException e) { + throw new RuntimeException(e); + } finally { + IoUtil.close(statement); + } + } +} diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/handlers/schema/PostgreSqlSchemaHandler.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/handlers/schema/PostgreSqlSchemaHandler.java new file mode 100644 index 0000000..307b2c0 --- /dev/null +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/handlers/schema/PostgreSqlSchemaHandler.java @@ -0,0 +1,25 @@ +package com.qiaoba.common.database.handlers.schema; + +import org.springframework.stereotype.Component; + +import java.sql.Connection; +import java.sql.SQLException; + +/** + * PostgreSqlSchemaHandler + * + * @author ailanyin + * @version 1.0 + * @since 2023/6/20 9:29 + */ +@Component +public class PostgreSqlSchemaHandler implements SchemaHandler { + @Override + public void setSchema(Connection conn) { + try { + conn.setSchema(""); + } catch (SQLException e) { + e.printStackTrace(); + } + } +} diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/handlers/schema/SchemaHandler.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/handlers/schema/SchemaHandler.java new file mode 100644 index 0000000..9829a26 --- /dev/null +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/handlers/schema/SchemaHandler.java @@ -0,0 +1,20 @@ +package com.qiaoba.common.database.handlers.schema; + +import java.sql.Connection; + +/** + * Schema处理器 + * + * @author ailanyin + * @version 1.0 + * @since 2023/6/20 9:18 + */ +public interface SchemaHandler { + + /** + * 设置/切换schema + * + * @param conn conn + */ + void setSchema(Connection conn); +} diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/handlers/schema/SchemaHandlerFactory.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/handlers/schema/SchemaHandlerFactory.java new file mode 100644 index 0000000..de9bf01 --- /dev/null +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/handlers/schema/SchemaHandlerFactory.java @@ -0,0 +1,40 @@ +package com.qiaoba.common.database.handlers.schema; + +import com.qiaoba.common.base.enums.DataBaseEnum; +import com.qiaoba.common.base.exceptions.ServiceException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; + +/** + * SchemaHandlerFactory-用于选择哪种类型处理器 + * + * @author ailanyin + * @version 1.0 + * @since 2023/6/20 9:22 + */ +@Component +@RequiredArgsConstructor +public class SchemaHandlerFactory { + + private static Map handlerMap = new ConcurrentHashMap<>(); + + private final MysqlSchemaHandler mysqlSchemaHandler; + + @PostConstruct + public void register() { + handlerMap.put(DataBaseEnum.MY_SQL.getType(), mysqlSchemaHandler); + } + + public static SchemaHandler getHandler(String name) { + SchemaHandler schemaHandler = handlerMap.get(name); + if (Objects.isNull(schemaHandler)) { + throw new ServiceException("Schema处理器工厂异常, 类型:[" + name + "]找不到相对应的解析器"); + } + return schemaHandler; + } +} diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/interceptors/SchemaInterceptor.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/interceptors/SchemaInterceptor.java index 8a28398..d46ed5f 100644 --- a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/interceptors/SchemaInterceptor.java +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/interceptors/SchemaInterceptor.java @@ -4,6 +4,7 @@ import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; import com.qiaoba.common.base.context.BaseContext; +import com.qiaoba.common.database.handlers.schema.SchemaHandlerFactory; import org.apache.ibatis.executor.statement.StatementHandler; import org.springframework.beans.factory.annotation.Value; @@ -21,24 +22,13 @@ import java.util.Objects; */ public class SchemaInterceptor implements InnerInterceptor { - @Value("${spring.application.name}") - private String baseDatabase; + @Override public void beforePrepare(StatementHandler sh, Connection conn, Integer transactionTimeout) { if (Objects.nonNull(BaseContext.isSchemaMode()) && BaseContext.isSchemaMode()) { - // eg: use qiaoba-1; - String sql = StrUtil.format("use `{}-{}`;", baseDatabase, BaseContext.getTenantId()); - Statement statement = null; - try { - statement = conn.createStatement(); - statement.execute(sql); - } catch (SQLException e) { - throw new RuntimeException(e); - } finally { - IoUtil.close(statement); - } + SchemaHandlerFactory.getHandler(BaseContext.getDatabaseType()).setSchema(conn); } InnerInterceptor.super.beforePrepare(sh, conn, transactionTimeout); } diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/utils/JdbcUtil.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/utils/JdbcUtil.java index b3f16b9..8d1a995 100644 --- a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/utils/JdbcUtil.java +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/utils/JdbcUtil.java @@ -5,8 +5,7 @@ import cn.hutool.core.util.StrUtil; import com.qiaoba.common.base.exceptions.ServiceException; import lombok.extern.slf4j.Slf4j; -import java.sql.Connection; -import java.sql.DriverManager; +import java.sql.*; /** * JdbcUtil @@ -53,4 +52,25 @@ public class JdbcUtil { throw new ServiceException(StrUtil.format("数据源连接失败,错误: {}", e.getMessage())); } } + + public static void main(String[] args) { + Connection connection = null; + Statement statement = null; + ResultSet resultSet = null; + try { + connection = getConnection("oracle.jdbc.OracleDriver", "jdbc:oracle:thin:@//101.34.251.155:1521/ORCL", "ROOT", "root"); + statement = connection.createStatement(); + statement.executeQuery("alter session set current_schema=ROOT"); + resultSet = statement.executeQuery("SELECT * FROM SYS_USER"); + while (resultSet.next()) { + System.out.println(resultSet.getString("NICKNAME")); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + IoUtil.close(connection); + IoUtil.close(statement); + IoUtil.close(resultSet); + } + } }