Forráskód Böngészése

jdbc手动切换数据源

ZHOUTD 1 éve
szülő
commit
8c79cce884

+ 3 - 0
xzl-admin/src/main/java/com/xzl/web/controller/DataGovernanceController.java

@@ -10,6 +10,9 @@ import com.xzl.web.model.dataGovernance.entity.SysDataLog;
 import com.xzl.web.model.dataGovernance.entity.TableInfo;
 import com.xzl.web.service.DataGovernanceService;
 import org.apache.commons.io.IOUtils;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory;
+import org.mybatis.spring.SqlSessionTemplate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;

+ 5 - 4
xzl-admin/src/main/java/com/xzl/web/mapper/DataGovernanceMapper.java

@@ -2,10 +2,7 @@ package com.xzl.web.mapper;
 
 import com.xzl.web.model.dataGovernance.dto.CreateTableDTO;
 import com.xzl.web.model.dataGovernance.dto.DataReplicationParam;
-import com.xzl.web.model.dataGovernance.entity.DatabaseInfo;
-import com.xzl.web.model.dataGovernance.entity.SysDataLog;
-import com.xzl.web.model.dataGovernance.entity.TableInfo;
-import com.xzl.web.model.dataGovernance.entity.TableStructure;
+import com.xzl.web.model.dataGovernance.entity.*;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;
@@ -41,4 +38,8 @@ public interface DataGovernanceMapper {
 
     Integer getDataCount(String tableName);
 
+    List<DatabaseInfo> getDatabaseConfig();
+
+    DatabaseConfig getDatabaseConfig(String id);
+
 }

+ 12 - 0
xzl-admin/src/main/java/com/xzl/web/model/dataGovernance/entity/DatabaseConfig.java

@@ -0,0 +1,12 @@
+package com.xzl.web.model.dataGovernance.entity;
+
+import lombok.Data;
+
+@Data
+public class DatabaseConfig {
+    private String connectionName;
+    private String databaseType;
+    private String url;
+    private String username;
+    private String password;
+}

+ 46 - 5
xzl-admin/src/main/java/com/xzl/web/service/impl/DataGovernanceServiceImpl.java

@@ -10,20 +10,21 @@ import com.xzl.web.model.dataGovernance.dto.SysDataLogQueryParam;
 import com.xzl.web.model.dataGovernance.dto.TableDataQueryParam;
 import com.xzl.web.model.dataGovernance.entity.*;
 import com.xzl.web.service.DataGovernanceService;
+import com.xzl.web.utils.SqlHelper;
 import org.apache.ibatis.io.Resources;
 import org.apache.ibatis.jdbc.ScriptRunner;
-import org.mybatis.spring.SqlSessionTemplate;
+import org.apache.ibatis.session.SqlSessionFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.annotation.PostConstruct;
 import java.io.*;
 import java.nio.charset.Charset;
-import java.sql.Connection;
-import java.sql.Driver;
-import java.sql.DriverManager;
+import java.sql.*;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -34,9 +35,12 @@ public class DataGovernanceServiceImpl implements DataGovernanceService {
     @Autowired
     private DataGovernanceMapper dataGovernanceMapper;
 
+    private Connection connection;
+
+    private Map<String,String> driver;
 
     @Autowired
-    private SqlSessionTemplate sqlSessionTemplate;
+    private SqlSessionFactory sqlSessionFactory;
 
     @Value("${spring.datasource.druid.master.url}")
     private String url;
@@ -50,9 +54,41 @@ public class DataGovernanceServiceImpl implements DataGovernanceService {
     @Value("${sqlFilePath}")
     private String sqlFilePath;
 
+    private static final String NAME_SPACE="com.xzl.web.mapper.DataGovernanceMapper";
+
+
+    @PostConstruct
+    private void init() {
+        DatabaseConfig databaseConfig = dataGovernanceMapper.getDatabaseConfig("2");
+        this.driverInit();
+        try {
+            Class.forName(driver.get(databaseConfig.getDatabaseType()));
+            this.connection=DriverManager.getConnection(databaseConfig.getUrl(),databaseConfig.getUsername(), databaseConfig.getPassword());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 
     @Override
     public List<DatabaseInfo> getDatabaseList() {
+
+        String sql = SqlHelper.getNamespaceSql(sqlSessionFactory, NAME_SPACE+".getDatabaseList", null);
+        List<DatabaseInfo> data=new ArrayList<>();
+        try {
+            Statement statement = this.connection.createStatement();
+            ResultSet resultSet = statement.executeQuery(sql);
+            while (resultSet.next()) {
+                DatabaseInfo databaseInfo=new DatabaseInfo();
+                databaseInfo.getClass().getFields();
+                databaseInfo.setDatabaseName(resultSet.getString(1));
+                databaseInfo.setCharacterName(resultSet.getString(2));
+                databaseInfo.setCollationName(resultSet.getString(3));
+                data.add(databaseInfo);
+            }
+            System.out.println(data);
+        } catch (SQLException throwable) {
+            throwable.printStackTrace();
+        }
         return dataGovernanceMapper.getDatabaseList();
     }
 
@@ -362,4 +398,9 @@ public class DataGovernanceServiceImpl implements DataGovernanceService {
     private Boolean verifySQLName(String text) {
         return text.isEmpty() || !text.matches("^[a-zA-Z_][a-zA-Z0-9_]{0,63}$");
     }
+
+    private void driverInit(){
+        this.driver=new HashMap<>();
+        this.driver.put("mysql","com.mysql.cj.jdbc.Driver");
+    }
 }

+ 126 - 0
xzl-admin/src/main/java/com/xzl/web/utils/SqlHelper.java

@@ -0,0 +1,126 @@
+package com.xzl.web.utils;
+
+import org.apache.ibatis.mapping.BoundSql;
+        import org.apache.ibatis.mapping.MappedStatement;
+        import org.apache.ibatis.mapping.ParameterMapping;
+        import org.apache.ibatis.mapping.ParameterMode;
+        import org.apache.ibatis.reflection.MetaObject;
+        import org.apache.ibatis.session.Configuration;
+        import org.apache.ibatis.session.SqlSessionFactory;
+        import org.apache.ibatis.type.JdbcType;
+        import org.apache.ibatis.type.TypeHandlerRegistry;
+
+        import java.util.HashMap;
+        import java.util.List;
+        import java.util.Map;
+
+        import static org.apache.ibatis.type.JdbcType.VARCHAR;
+
+/**
+ * Mybatis - 获取Mybatis查询sql工具
+ */
+public class SqlHelper {
+
+    /**
+     * 通过命名空间方式获取sql
+     * @param sqlSessionFactory
+     * @param namespace
+     * @param params
+     * @return
+     */
+    public static String getNamespaceSql(SqlSessionFactory sqlSessionFactory, String namespace, Object params) {
+        params = wrapCollection(params);
+        Configuration configuration = sqlSessionFactory.getConfiguration();
+        MappedStatement mappedStatement = configuration.getMappedStatement(namespace);
+        TypeHandlerRegistry typeHandlerRegistry = mappedStatement.getConfiguration().getTypeHandlerRegistry();
+        BoundSql boundSql = mappedStatement.getBoundSql(params);
+        List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
+        StringBuilder sqlStringBuilder = new StringBuilder(boundSql.getSql().replaceAll("\n", ""));
+        if (params != null && parameterMappings != null && parameterMappings.size() > 0) {
+            for (ParameterMapping parameterMapping : parameterMappings) {
+                if (parameterMapping.getMode() != ParameterMode.OUT) {
+                    Object value;
+                    String propertyName = parameterMapping.getProperty();
+                    if (boundSql.hasAdditionalParameter(propertyName)) {
+                        value = boundSql.getAdditionalParameter(propertyName);
+                    } else if (typeHandlerRegistry.hasTypeHandler(params.getClass())) {
+                        value = params;
+                    } else {
+                        MetaObject metaObject = configuration.newMetaObject(params);
+                        value = metaObject.getValue(propertyName);
+                    }
+                    JdbcType jdbcType = parameterMapping.getJdbcType();
+                    if (jdbcType == null) {
+                        jdbcType = VARCHAR;
+                    }
+                    replaceParameter(sqlStringBuilder, value, jdbcType);
+                }
+            }
+        }
+        return sqlStringBuilder.toString();
+    }
+
+    /**
+     * 根据类型替换参数
+     * 仅作为数字和字符串两种类型进行处理,需要特殊处理的可以继续完善这里
+     *
+     * @param sqlStringBuilder
+     * @param value
+     * @param jdbcType
+     * @return
+     */
+    private static void replaceParameter(StringBuilder sqlStringBuilder, Object value, JdbcType jdbcType) {
+        if (value == null) {
+            return;
+        }
+
+        String strValue = String.valueOf(value);
+        switch (jdbcType) {
+            //数字
+            case BIT:
+                break;
+            case TINYINT:
+                break;
+            case SMALLINT:
+                break;
+            case INTEGER:
+                break;
+            case BIGINT:
+                break;
+            case FLOAT:
+                break;
+            case REAL:
+                break;
+            case DOUBLE:
+                break;
+            case NUMERIC:
+                break;
+            case DECIMAL:
+                break;
+            //其他,包含字符串和其他特殊类型,加单引号
+            default:
+                strValue = "'" + strValue + "'";
+        }
+        int index = sqlStringBuilder.indexOf("?");
+        sqlStringBuilder.replace(index, index+1, strValue);
+    }
+
+    /**
+     * 简单包装参数
+     *
+     * @param object
+     * @return
+     */
+    private static Object wrapCollection(final Object object) {
+        if (object instanceof List) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("list", object);
+            return map;
+        } else if (object != null && object.getClass().isArray()) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("array", object);
+            return map;
+        }
+        return object;
+    }
+}

+ 13 - 0
xzl-admin/src/main/resources/mapper/DataGovernanceMapper.xml

@@ -93,6 +93,19 @@
         LIMIT ${page},${pageSize}
     </select>
 
+    <select id="getDatabaseConfig" parameterType="string" resultType="com.xzl.web.model.dataGovernance.entity.DatabaseConfig">
+        SELECT CONNECTION_NAME AS "connectionName",
+               DATABASE_TYPE AS "databaseType",
+               URL AS "url",
+               USERNAME AS "username",
+               PASSWORD AS "password"
+        FROM
+               DATABASE_CONFIG
+        <where>
+            <if test="id!=null">and id = #{id}</if>
+        </where>
+    </select>
+
     <update id="createDatabase" parameterType="string">
         CREATE DATABASE IF NOT EXISTS ${databaseName}
         DEFAULT CHARACTER SET utf8mb4