diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 5db292a..ee9f695 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -2,7 +2,13 @@ \ No newline at end of file diff --git a/muyu-source-client/src/main/java/com/muyu/config/SourceClientConfig.java b/muyu-source-client/src/main/java/com/muyu/config/SourceClientConfig.java index 0e2c2c1..4dac414 100644 --- a/muyu-source-client/src/main/java/com/muyu/config/SourceClientConfig.java +++ b/muyu-source-client/src/main/java/com/muyu/config/SourceClientConfig.java @@ -1,9 +1,12 @@ package com.muyu.config; +import cn.hutool.core.math.Arrangement; import com.muyu.common.core.domain.Result; +import com.muyu.connection.DataSourceConfig; import com.muyu.source.domain.Children; import com.muyu.source.domain.DataSource; import com.muyu.source.domain.DataType; +import com.muyu.source.domain.model.DataModel; import com.muyu.source.remote.RemoteChildrenService; import com.muyu.source.remote.RemoteDataSourceService; import com.muyu.source.remote.RemoteDataTypeService; @@ -11,6 +14,9 @@ import jakarta.annotation.Resource; import org.springframework.context.annotation.ComponentScan; import java.sql.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; /** * @author Lenovo @@ -22,48 +28,57 @@ import java.sql.*; */ @ComponentScan public class SourceClientConfig { - @Resource - private RemoteDataTypeService remoteDataTypeService; @Resource private RemoteDataSourceService remoteDataSourceService; @Resource private RemoteChildrenService remoteChildrenService; - public void getDataModel(Long id){ - //根据ID查询出数据源的数据 - Result dataSourceResult =remoteDataSourceService.getDataSource(id); - DataSource dataSource = dataSourceResult.getData(); - //根据ID查询出数据库类型的数据 - Result dataTypeResult = remoteDataTypeService.getDataType(dataSource.getDataType()); - DataType dataType = dataTypeResult.getData(); - //根据ID查询出数据源的数据库结构的数据 - Result childrenResult =remoteChildrenService.getChildren(dataSource.getId()); + public List> getDataModel(Long id) { + List> list = new ArrayList<>(); + //根据ID查询出表结构的数据 + Result childrenResult = remoteChildrenService.getChildren(id); Children children = childrenResult.getData(); - - - try { - Class.forName(dataType.getDriverManager()); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); + //根据ID查询出数据源的数据 + Result dataSourceResult = remoteDataSourceService.getDataSource(children.getAssetId()); + DataSource dataSource = dataSourceResult.getData(); + String sql = ""; + if ("MySql".equals(dataSource.getDataType())) { + sql = "SELECT * FROM " + children.getName(); } try { - //获取连接对象 拼接数据库地址 - Connection connection = DriverManager.getConnection(dataType.getPrefix()+dataSource.getIp()+dataSource.getPort() - +"//"+dataSource.getDatabaseName()+"?"+dataSource.getConnectionParam(),dataSource.getUserName(),dataSource.getPassword()); - //创建执行对象 - Statement statement = connection.createStatement(); - //拼接sql语句 - ResultSet resultSet = statement.executeQuery("SELECT * FROM" + children.getName()); - //处理返回结果 - while (resultSet.next()){ - System.out.println(resultSet.getString(1)); + //调用连接池获取连接 + Connection connection = DataSourceConfig.getDataSource(dataSource.getId()); + PreparedStatement preparedStatement = connection.prepareStatement(sql); + ResultSet resultSet = preparedStatement.executeQuery(); + ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); + while (resultSet.next()) { + List dataModels = new ArrayList<>(); + for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) { + //获取列名 字段名 key + String columnName = resultSetMetaData.getColumnName(i); + //获取字段的值 value + Object value = resultSet.getObject(columnName); + //获取列的类型 字段的类型 type + String columnTypeName = resultSetMetaData.getColumnTypeName(i); + //获取列的标题 label + String columnLabel = resultSetMetaData.getColumnLabel(i); + // java类型 + String columnClassName = resultSetMetaData.getColumnClassName(i); + DataModel dataModel = DataModel.builder() + .key(columnName) + .label(columnLabel) + .type(columnTypeName) + .value(value) + .build(); + dataModels.add(dataModel); + } + list.add(dataModels); } - //关闭资源 - resultSet.close(); - statement.close(); - connection.close(); + //归还连接 + DataSourceConfig.returnConnection(connection); } catch (SQLException e) { throw new RuntimeException(e); } + return list; } } diff --git a/muyu-source-client/src/main/java/com/muyu/config/SourceClientRunner.java b/muyu-source-client/src/main/java/com/muyu/config/SourceClientRunner.java new file mode 100644 index 0000000..f624787 --- /dev/null +++ b/muyu-source-client/src/main/java/com/muyu/config/SourceClientRunner.java @@ -0,0 +1,45 @@ +package com.muyu.config; + +import com.muyu.common.core.domain.Result; +import com.muyu.connection.DataSourceConfig; +import com.muyu.source.domain.DataSource; +import com.muyu.source.domain.DataType; +import com.muyu.source.remote.RemoteChildrenService; +import com.muyu.source.remote.RemoteDataSourceService; +import com.muyu.source.remote.RemoteDataTypeService; +import jakarta.annotation.Resource; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +/** + * @author Lenovo + * @ Tool:IntelliJ IDEA + * @ Author:CHX + * @ Date:2024-08-23-9:45 + * @ Version:1.0 + * @ Description:初始化加载 + */ +@Log4j2 +@Configuration +public class SourceClientRunner implements ApplicationRunner { + @Resource + private RemoteDataSourceService remoteDataSourceService; + @Resource + private RemoteDataTypeService remoteDataTypeService; + @Override + public void run(ApplicationArguments args) throws Exception { + Result> sourceResult = remoteDataSourceService.getDataSourceList(); + log.info(sourceResult); + List sourceList = sourceResult.getData(); + sourceList.stream().forEach(source -> { + Result dataTypeResult = remoteDataTypeService.getDataType(source.getDataType()); + DataType dataType = dataTypeResult.getData(); + DataSourceConfig.init(source, dataType); + }); + } +} diff --git a/muyu-source-common/src/main/java/com/muyu/source/domain/model/DataModel.java b/muyu-source-common/src/main/java/com/muyu/source/domain/model/DataModel.java new file mode 100644 index 0000000..5ea3231 --- /dev/null +++ b/muyu-source-common/src/main/java/com/muyu/source/domain/model/DataModel.java @@ -0,0 +1,39 @@ +package com.muyu.source.domain.model; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * @author Lenovo + * @ Tool:IntelliJ IDEA + * @ Author:CHX + * @ Date:2024-08-23-9:41 + * @ Version:1.0 + * @ Description:数据转换对象 + */ +@Data +@SuperBuilder +@AllArgsConstructor +@NoArgsConstructor +public class DataModel { + /** + * 键 + */ + private String key; + /** + * 标签 + */ + private String label; + /** + * 类型 + */ + private String type; + /** + * 值 + */ + private Object value; + + +} diff --git a/muyu-source-remote/src/main/java/com/muyu/source/remote/RemoteDataSourceService.java b/muyu-source-remote/src/main/java/com/muyu/source/remote/RemoteDataSourceService.java index 266ab05..036df48 100644 --- a/muyu-source-remote/src/main/java/com/muyu/source/remote/RemoteDataSourceService.java +++ b/muyu-source-remote/src/main/java/com/muyu/source/remote/RemoteDataSourceService.java @@ -8,6 +8,8 @@ import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import java.util.List; + /** * @author Lenovo * @ Tool:IntelliJ IDEA @@ -23,4 +25,7 @@ public interface RemoteDataSourceService { @GetMapping("/getDataSourceById/{id}") Result getDataSource(@PathVariable Long id); + @GetMapping("/getDataSourceList") + Result> getDataSourceList(); + } diff --git a/muyu-source-remote/src/main/java/com/muyu/source/remote/factory/RemoteDataSourceFactory.java b/muyu-source-remote/src/main/java/com/muyu/source/remote/factory/RemoteDataSourceFactory.java index 49ea8d1..19b5212 100644 --- a/muyu-source-remote/src/main/java/com/muyu/source/remote/factory/RemoteDataSourceFactory.java +++ b/muyu-source-remote/src/main/java/com/muyu/source/remote/factory/RemoteDataSourceFactory.java @@ -5,6 +5,8 @@ import com.muyu.source.domain.DataSource; import com.muyu.source.remote.RemoteDataSourceService; import org.springframework.cloud.openfeign.FallbackFactory; +import java.util.List; + /** * @author Lenovo * @ Tool:IntelliJ IDEA @@ -21,6 +23,11 @@ public class RemoteDataSourceFactory implements FallbackFactory getDataSource(Long id) { return Result.error(cause.getMessage()); } + + @Override + public Result> getDataSourceList() { + return Result.error(cause.getMessage()); + } }; } } diff --git a/muyu-source-server/src/main/java/com/muyu/source/controller/DataSourceController.java b/muyu-source-server/src/main/java/com/muyu/source/controller/DataSourceController.java index 23ca26d..de3b7e4 100644 --- a/muyu-source-server/src/main/java/com/muyu/source/controller/DataSourceController.java +++ b/muyu-source-server/src/main/java/com/muyu/source/controller/DataSourceController.java @@ -1,5 +1,7 @@ package com.muyu.source.controller; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.dtflys.forest.springboot.annotation.ForestScannerRegister; import com.muyu.common.core.domain.Result; import com.muyu.common.core.utils.poi.ExcelUtil; @@ -45,6 +47,36 @@ public class DataSourceController extends BaseController { @Autowired private DataSourceService dataSourceService; + /** + * 测试连接 + * @param dataSource 数据源 + * @return 是否连接成功 + */ + @PostMapping("/test") + public Result testConnection(@RequestBody DataSource dataSource){ + Boolean b =dataSourceService.testConnection(dataSource); + if(b){ + dataSourceService.update(new LambdaUpdateWrapper<>() {{ + set(DataSource::getIsInit, "Y"); + eq(DataSource::getId, dataSource.getId()); + }}); + return Result.success(b,"连接成功"); + } + return Result.error("连接失败"); + } + + + + /** + * 获取数据源列表 + * @return 数据源列表 + */ + @GetMapping("/getDataSourceList") + public Result> getDataSourceList(){ + List dataSourceList =dataSourceService.list(); + return success(dataSourceList); + } + /** * 查询数据源列表 */ diff --git a/muyu-source-server/src/main/java/com/muyu/source/service/DataSourceService.java b/muyu-source-server/src/main/java/com/muyu/source/service/DataSourceService.java index 812f1bb..69e8b24 100644 --- a/muyu-source-server/src/main/java/com/muyu/source/service/DataSourceService.java +++ b/muyu-source-server/src/main/java/com/muyu/source/service/DataSourceService.java @@ -39,5 +39,5 @@ public interface DataSourceService extends IService { Boolean checkIdUnique(DataSource dataSource); - + Boolean testConnection(DataSource dataSource); } diff --git a/muyu-source-server/src/main/java/com/muyu/source/service/DataTypeService.java b/muyu-source-server/src/main/java/com/muyu/source/service/DataTypeService.java new file mode 100644 index 0000000..762944b --- /dev/null +++ b/muyu-source-server/src/main/java/com/muyu/source/service/DataTypeService.java @@ -0,0 +1,14 @@ +package com.muyu.source.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.muyu.source.domain.DataType; + +/** + * @ Tool:IntelliJ IDEA + * @ Author:CHX + * @ Date:2024-08-23-18:59 + * @ Version:1.0 + * @ Description:数据库类型业务层 + */ +public interface DataTypeService extends IService { +} diff --git a/muyu-source-server/src/main/java/com/muyu/source/service/Impl/DataSourceServiceImpl.java b/muyu-source-server/src/main/java/com/muyu/source/service/Impl/DataSourceServiceImpl.java index 06c1a19..ce74a1d 100644 --- a/muyu-source-server/src/main/java/com/muyu/source/service/Impl/DataSourceServiceImpl.java +++ b/muyu-source-server/src/main/java/com/muyu/source/service/Impl/DataSourceServiceImpl.java @@ -5,11 +5,18 @@ import com.baomidou.mybatisplus.core.toolkit.Assert; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.muyu.common.core.utils.StringUtils; import com.muyu.source.domain.DataSource; +import com.muyu.source.domain.DataType; import com.muyu.source.mapper.DataSourceMapper; import com.muyu.source.service.DataSourceService; +import com.muyu.source.service.DataTypeService; +import jakarta.annotation.Resource; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; +import java.util.concurrent.ExecutorService; + +import static java.util.concurrent.Executors.newFixedThreadPool; /** * @author Lenovo @@ -22,6 +29,10 @@ import java.util.List; @Service public class DataSourceServiceImpl extends ServiceImpl implements DataSourceService { + @Resource + private DataTypeService dataTypeService; + private final ExecutorService executor = newFixedThreadPool(10); + /** * 精确查询数据源 @@ -79,5 +90,45 @@ public class DataSourceServiceImpl extends ServiceImpl 0; } + /** + * 测试连接 + * @param dataSource 数据源 + * @return 结果 + */ + @Override + public Boolean testConnection(DataSource dataSource) { + DataType dataType = dataTypeService.getOne(new LambdaQueryWrapper<>() {{ + eq(DataType::getType, dataSource.getDataType()); + }}); + // + String jdbcUrl=""; + boolean flag=false; + try{ + //判空 + if(dataType.getDriverManager()!=null && dataType.getPrefix()!=null){ + if("MySql".equals(dataType.getType())){ + //mysql拼接连接路径 + jdbcUrl=dataType.getDriverManager()+dataType.getPrefix()+dataSource.getIp()+":"+dataSource.getPort()+"/"+dataSource.getDatabaseName()+"?"+dataSource.getConnectionParam(); + } + flag=testConnection(dataType.getDriverManager(),jdbcUrl,dataSource.getUserName(),dataSource.getPassword()); + } + return flag; + }catch (Exception e){ + e.printStackTrace(); + } + return flag; + } + + private boolean testConnection(String driverManager, String jdbcUrl, String userName, String password) { + if(StringUtils.isNotEmpty(driverManager) && StringUtils.isNotEmpty(jdbcUrl) && StringUtils.isNotEmpty(userName) && StringUtils.isNotEmpty(password)){ + try{ + Class.forName(driverManager); + return true; + }catch (Exception e){ + e.printStackTrace(); + } + } + return false; + } }