Maven引入
<dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>sqljdbc4</artifactId><version>4.0</version></dependency><dependency><groupId>net.sourceforge.jtds</groupId><artifactId>jtds</artifactId><version>1.3.1</version></dependency>
连接创建
// 数据库URL,用户名和密码String connectionUrl = "jdbc:jtds:sqlserver://"+dataSource.getIp()+":"+dataSource.getPort()+";databaseName="+dataSource.getDatabaseName()+";user="+dataSource.getUserName()+";password="+dataSource.getPassword()+";";try {Class.forName("net.sourceforge.jtds.jdbc.Driver");} catch (ClassNotFoundException e) {throw new RuntimeException("当前不支持的SQLServer驱动版本");}
查询样例(SQLServer通用数据采集)
表内容查询
public List<List<JSONObject>> importData(DataSourceImportDataVO dataSourceImportDataVO) {List<List<JSONObject>> rtn = new ArrayList<>();TbDataSource dataSource = dataSourceImportDataVO.getDataSource();Long dataCollectJobId = dataSourceImportDataVO.getDataCollect().getId();if (!DataSourceLinkTypeEnum.SQLSERVER.getTypeCode().equals(dataSource.getLinkType())){collectStatusMQService.send(dataCollectJobId, CollectJobRunStatusTypeEnum.CONNECT_FAILED);collectRecordMQService.send(dataSourceImportDataVO, CollectJobRunStatusTypeEnum.CONNECT_FAILED, "", "");throw new CustomException("数据源不是 SQLServer 连接");}SQLServerDataDealBaseService dataDealBaseService =(SQLServerDataDealBaseService) dataSourceImportDataVO.getDataDealBaseService();Date date = new Date();String connectionUrl = "jdbc:jtds:sqlserver://"+dataSource.getIp()+":"+dataSource.getPort()+";databaseName="+dataSource.getDatabaseName();try {Class.forName("net.sourceforge.jtds.jdbc.Driver");} catch (ClassNotFoundException e) {collectStatusMQService.send(dataCollectJobId, CollectJobRunStatusTypeEnum.CONNECT_FAILED);collectRecordMQService.send(dataSourceImportDataVO, CollectJobRunStatusTypeEnum.CONNECT_FAILED, "", "");return new ArrayList<>();}String user = dataSource.getUserName();String password = dataSource.getPassword();List<JSONObject> datas = new ArrayList<>();try (Connection con = DriverManager.getConnection(connectionUrl, user, password);Statement stmt = con.createStatement()) {SQLServerDealVO sqlServerDealVO = new SQLServerDealVO();sqlServerDealVO.setConnection(con);sqlServerDealVO.setStatement(stmt);sqlServerDealVO.setTableName(dataSourceImportDataVO.getDataCollect().getFileType());sqlServerDealVO.setDataSourceImportData(dataSourceImportDataVO);sqlServerDealVO.setDataCollectJobId(dataCollectJobId);collectStatusMQService.send(dataCollectJobId, CollectJobRunStatusTypeEnum.CONNECT_SUCCESS);datas = dataDealBaseService.fromSQLServer(sqlServerDealVO);rtn.add(datas);} catch (SQLException e) {log.error("【SQLServer 连接创建失败】 ", e);collectStatusMQService.send(dataCollectJobId, CollectJobRunStatusTypeEnum.CONNECT_FAILED);collectRecordMQService.send(dataSourceImportDataVO, CollectJobRunStatusTypeEnum.CONNECT_FAILED, "", "");return new ArrayList<>();}catch (DataParsingException e){log.error("【SQLServer 数据解析失败】 ", e);collectRecordMQService.send(dataSourceImportDataVO, CollectJobRunStatusTypeEnum.PARSE_FAILED, JSON.toJSONString(datas), "采集数据源中的表 "+dataSourceImportDataVO.getDataCollect().getFileType()+" 或该表同步字段 "+dataSourceImportDataVO.getDataCollect().getSynchronousField()+" 不存在");return new ArrayList<>();}log.info("【数据接入】【SQLServer】处理完成 耗时 {} 秒 ", (new DateBetween(date, new Date())).between(DateUnit.SECOND));return rtn;}
表名称获取
public List<String> getDataSourceTables(TbDataSource dataSource) {String connectionUrl = "jdbc:jtds:sqlserver://"+dataSource.getIp()+":"+dataSource.getPort()+";databaseName="+dataSource.getDatabaseName()+";user="+dataSource.getUserName()+";password="+dataSource.getPassword()+";";List<String> tables = new ArrayList<>();try {Class.forName("net.sourceforge.jtds.jdbc.Driver");} catch (ClassNotFoundException e) {throw new RuntimeException("当前不支持的SQLServer驱动版本");}try (Connection connection = DriverManager.getConnection(connectionUrl)) {Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'");while (resultSet.next()) {tables.add(resultSet.getString("TABLE_NAME"));}} catch (SQLException e) {e.printStackTrace();}return tables;}
字段名称获取
private final String pattern = "对象名\\s+'.*?'\\s+无效";public List<GetSourceColumnOutputDTO> getSourceColumns(TbDataSource dataSource, String tableName) {String connectionUrl = "jdbc:jtds:sqlserver://" + dataSource.getIp() + ":" + dataSource.getPort() + ";databaseName="+ dataSource.getDatabaseName() + ";user=" + dataSource.getUserName() + ";password=" + dataSource.getPassword() + ";";List<GetSourceColumnOutputDTO> colums = new ArrayList<>();try {Class.forName("net.sourceforge.jtds.jdbc.Driver");} catch (ClassNotFoundException e) {throw new RuntimeException("当前不支持的SQLServer驱动版本");}try (Connection connection = DriverManager.getConnection(connectionUrl)) {
Statement statement = connection.createStatement();String sql = "SELECT \n" +" CONVERT(NVARCHAR(100), c.name) AS ColumnName,\n" +" CONVERT(NVARCHAR(100),ep.value) AS ColumnComment\n" +"FROM \n" +" sys.columns c\n" +"INNER JOIN \n" +" sys.objects o ON c.object_id = o.object_id\n" +"LEFT OUTER JOIN \n" +" sys.extended_properties ep ON ep.major_id = c.object_id \n" +" AND ep.minor_id = c.column_id \n" +" AND ep.name = 'MS_Description'\n" +"WHERE \n" +String.format(" o.name = '%s' \n", tableName) +"ORDER BY \n" +" c.column_id;";ResultSet resultSet = null;try {resultSet = statement.executeQuery(sql);} catch (SQLException e) {if (e.getMessage().matches(".*" + pattern + ".*")){sql = "SELECT \n" +" CONVERT(NVARCHAR(100), sc.name) AS ColumnName,\n" +" CONVERT(NVARCHAR(100), sp.value) AS ColumnComment\n" +" FROM \n" +" syscolumns sc\n" +" INNER JOIN \n" +" sysobjects so ON sc.id = so.id\n" +" LEFT OUTER JOIN \n" +" sysproperties sp ON sp.id = sc.id \n" +" AND sp.smallid = sc.colid \n" +" AND sp.name = 'MS_Description'\n" +" WHERE \n" +String.format(" so.name = '%s' \n", tableName) +" ORDER BY \n" +" sc.colid";resultSet = statement.executeQuery(sql);}}if (Objects.isNull(resultSet)) {return colums;}int sort = 1;while (resultSet.next()) {GetSourceColumnOutputDTO tmp = new GetSourceColumnOutputDTO();String columnName = resultSet.getString("ColumnName");String columnComment = resultSet.getString("ColumnComment");tmp.setName(StringUtils.isEmpty(columnComment) ? columnName : columnComment);tmp.setCode(columnName);tmp.setOriginCode(columnName);tmp.setSort(sort++);colums.add(tmp);}} catch (SQLException e) {e.printStackTrace();}return colums;}
public class GetSourceColumnOutputDTO implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty(value = "字段中文名")private String name;@ApiModelProperty(value = "源字段编码")private String code;@ApiModelProperty(value = "源字段原始编码")private String originCode;@ApiModelProperty(value = "源字段协议中的排序")private Integer sort;}