mybatis-plus整合dynamic-datasource-spring-boot-starter之手动切换多数据源(“坎坷之路”)

简介:今天公司有一个这样场景业务,简单来说需要动态第三方数据源数据库,数据源信息,一开始根据想要查看的表进行一个表的信息与表的数据库信息获取,然后保存本地库内,用户可在界面点击获取到的表进行业务数据处理,需求重点:数据库是动态(会有不同类型数据库,也可能会有多种同种类型数据库),表字段是动态(不同数据库不同字段),所以根据这几点来处理你的CRUD,经过几天资源分析官网搜索,终于找到简洁并且效率性的多数据源实现方式,菜鸡一枚,唔介意。

1、废话不多说,首先引入依赖

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3.4</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.4</version>
        </dependency>

2、配置主数据源(这里只需配置主数据源)

spring:
  datasource:
    dynamic:
      primary: master
      strict: false
      datasource:
        master:
          url: jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&serverTimezone=UTC&serverTimezone=GMT%2B8
          username: root
          password: 123456
          driverClassName: com.mysql.cj.jdbc.Driver
          type: com.alibaba.druid.pool.DruidDataSource
          druid:
            maxActive: 300
            initialSize: 20
            maxWait: 6000
            minIdle: 20
            timeBetweenEvictionRunsMillis: 60000
            minEvictableIdleTimeMillis: 30000
            validationQuery: select 'x'
            testWhileIdle: true
            testOnBorrow: true
            testOnReturn: false

3、配置公共数据源切换类(备注我这里的子库链接信息是存储在主库表内,流程-》主库内获取数据配置信息表-》写入到DataSourceProperty的对象内,然后加入到核心数据源组件内)

package com.gennlife.datamap.masterdata.common.dbconfig;


import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.creator.*;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.gennlife.datamap.masterdata.common.constant.SystemConstants;
import com.gennlife.datamap.masterdata.po.CdcDatasourceConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


import javax.sql.DataSource;
import java.util.Set;


/**
 * @author: lyk
 * @Email: liyukai@gennlife.com
 * @Description: 公共动态数据源配置类
 * @date: 2022/1/14 5:25 下午
 * @Version V1.0
 */
@Service
public class DynamicDataSourceConfig {
    @Autowired
    DataSource dataSource;
    @Autowired
    DefaultDataSourceCreator dataSourceCreator;

    /**
     * 获取当前数据源
     *
     * @return
     */
    public Set<String> dataSourceNow() {
        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
        return ds.getDataSources().keySet();
    }


    /**
     * 添加数据源
     *
     * @param dto
     * @return
     */
    public Set<String> add(CdcDatasourceConfig dto) {
        DataSourceProperty dataSourceProperty = new DataSourceProperty();
        dataSourceProperty.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSourceProperty.setUrl(dto.getDatabaseIp());
        dataSourceProperty.setUsername(dto.getDatabaseAccount());
        dataSourceProperty.setPassword(dto.getDatabasePassword());
        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
        DataSource dataSource = dataSourceCreator.createDataSource(dataSourceProperty);
        ds.addDataSource(SystemConstants.other_datasource, dataSource);//这里写入ds注解的时候建议制定同种类型数据库走一个ds注解值(我这里实际需求会从数据库获取自定义的ds注解值)
        return ds.getDataSources().keySet();
    }


    /**
     * 删除数据源
     *
     * @param name
     * @return
     */
    public String remove(String name) {
        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
        ds.removeDataSource(name);
        return name + "删除成功!";
    }




}

4、定义实体类对象

package com.gennlife.datamap.masterdata.po;


import com.alibaba.druid.support.monitor.annotation.MTable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;


/**
 * cdc_datasource_config
 * @author 
 */
@ApiModel(value="数据源配置表")
@Data
public class CdcDatasourceConfig implements Serializable {
    private Integer id;


    /**
     * 数据源ID
     */
    @ApiModelProperty(value="数据源ID")
    private Integer datasourceId;


    /**
     * 主数据ID
     */
    @ApiModelProperty(value="主数据ID")
    private Integer mdmModelId;


    /**
     * 数据源类型
     */
    @ApiModelProperty(value="数据源类型")
    private String datasourceType;


    /**
     * 数据库IP
     */
    @ApiModelProperty(value="数据库IP")
    private String databaseIp;


    /**
     * 数据库端口
     */
    @ApiModelProperty(value="数据库端口")
    private String databasePort;


    /**
     * 数据库名
     */
    @ApiModelProperty(value="数据库名")
    private String databaseName;


    /**
     * 数据库账户名
     */
    @ApiModelProperty(value="数据库账户名")
    private String databaseAccount;


    /**
     * 数据库密码
     */
    @ApiModelProperty(value="数据库密码")
    private String databasePassword;


    /**
     * 创建人
     */
    @ApiModelProperty(value="创建人")
    private String creator;


    /**
     * 创建时间
     */
    @ApiModelProperty(value="创建时间")
    private Date createTime;


    /**
     * 修改人
     */
    @ApiModelProperty(value="修改人")
    private String updator;


    /**
     * 修改时间
     */
    @ApiModelProperty(value="修改时间")
    private Date updateTime;


    private static final long serialVersionUID = 1L;
}

5、定义子库mapper(备注:这里主库可以随意创建mapper,子库只需增加@DS(”“)注解)

package com.gennlife.datamap.masterdata.dao.datatype;


import com.baomidou.dynamic.datasource.annotation.DS;
import com.gennlife.datamap.masterdata.common.constant.SystemConstants;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;


import java.util.List;
import java.util.Map;


/**
 * @author: lyk
 * @Email: liyukai@gennlife.com
 * @Description:
 * @date: 2022/1/13 4:53 下午
 * @Version V1.0
 */
@Mapper
public interface CDCMySqlMapper {

    //备注:这里我定义的是一个公共DS组件,但是我们实际需求是支持多种不同数据库(并且可能会有两个或者多个同种类型数据库)所以这种情况下建议相同数据库类型可以制定同一个注解(例如:MySQL可以制定@DS(“mysql”),PG可以制定为@DS(”pg”)等)其次注意建议要放置在不同mapper或者不同方法上
    @DS(“mysql”)
    List<Map<String, Object>> selectByDataSourceId(@Param("fields") String fields, @Param("tableName") String tableName);

    @DS(“pg")
    List<Map<String, Object>> selectByDataSourceId(@Param("fields") String fields, @Param("tableName") String tableName);
}

6、定义xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.gennlife.datamap.masterdata.dao.datatype.CDCMySqlMapper">


    <select id="selectByDataSourceId" resultType="java.util.LinkedHashMap">
        SELECT ${fields}
        FROM ${tableName}
    </select>
</mapper>

7、单元测试

@Autowired
DynamicDataSourceConfig dynamicDataSourceConfig;

@Test
public void Test(){
    //数据库切换(注:我这里只会增加子数据源,主数据源不会影响,删除的时候也是删除子数据源)
    Set<String> addDataSource = dynamicDataSourceConfig.add(cdcDatasourceConfig);
    log.info("当前已增加数据源为:" + JSON.toJSON(addDataSource));
    List<Map<String, Object>> list = cdcMySqlMapper.selectByDataSourceId(StringUtils.strip(fieldList.toString(), "[]"), modelInfo.getModelName());
    String dataSourceName = dynamicDataSourceConfig.remove(other_datasource);
    log.info("当前已删除数据源为:" + dataSourceName);
    //拼接数据库类型mapper
    System.out.println(JSON.toJSON(list));
}

结果(这里只是大致使用流程,如果后期接触数据场景,建议深入研究下底层源码):

462C5398-F1B7-4745-9297-6E5A38BD3FF0.png最后附件:(详细业务代码应用)

1、公共动态数据源配置类

package com.gennlife.datamap.masterdata.common.dbconfig;


import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.creator.*;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.gennlife.datamap.masterdata.common.constant.SystemConstants;
import com.gennlife.datamap.masterdata.po.CdcDatasourceConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


import javax.sql.DataSource;
import java.util.Set;


/**
 * @author: lyk
 * @Email: liyukai@gennlife.com
 * @Description: 公共动态数据源配置类
 * @date: 2022/1/14 5:25 下午
 * @Version V1.0
 */
@Service
public class DynamicDataSourceConfig {
    @Autowired
    DataSource dataSource;
    @Autowired
    DefaultDataSourceCreator dataSourceCreator;


    /**
     * 获取当前数据源
     *
     * @return
     */
    public Set<String> dataSourceNow() {
        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
        return ds.getDataSources().keySet();
    }


    /**
     * 添加数据源
     *
     * @param dto
     * @return
     */
    public Set<String> add(CdcDatasourceConfig dto) {
        DataSourceProperty dataSourceProperty = new DataSourceProperty();
        dataSourceProperty.setDriverClassName(dto.getDriverClassName());
        dataSourceProperty.setUrl(dto.getDatabaseIp());
        dataSourceProperty.setUsername(dto.getDatabaseAccount());
        dataSourceProperty.setPassword(dto.getDatabasePassword());
        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
        DataSource dataSource = dataSourceCreator.createDataSource(dataSourceProperty);
        ds.addDataSource(dto.getDatasourceType(), dataSource);
        return ds.getDataSources().keySet();
    }


    /**
     * 删除数据源
     *
     * @param name
     * @return
     */
    public String remove(String name) {
        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
        ds.removeDataSource(name);
        return name + "删除成功!";
    }
}

2、数据源配置实体对象

package com.gennlife.datamap.masterdata.po;


import com.alibaba.druid.support.monitor.annotation.MTable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;


import java.io.Serializable;
import java.util.Date;


import lombok.Data;


/**
 * cdc_datasource_config
 *
 * @author
 */
@ApiModel(value = "数据源配置表")
@Data
public class CdcDatasourceConfig implements Serializable {
    private Integer id;


    /**
     * 数据源ID
     */
    @ApiModelProperty(value = "数据源ID")
    private Integer datasourceId;


    /**
     * 主数据ID
     */
    @ApiModelProperty(value = "主数据ID")
    private Integer mdmModelId;


    /**
     * 数据源类型
     */
    @ApiModelProperty(value = "数据源类型")
    private String datasourceType;


    /**
     * 数据库IP
     */
    @ApiModelProperty(value = "数据库IP")
    private String databaseIp;


    /**
     * 数据库端口
     */
    @ApiModelProperty(value = "数据库端口")
    private String databasePort;


    /**
     * 数据库名
     */
    @ApiModelProperty(value = "数据库名")
    private String databaseName;


    /**
     * 数据库账户名
     */
    @ApiModelProperty(value = "数据库账户名")
    private String databaseAccount;


    /**
     * 数据库密码
     */
    @ApiModelProperty(value = "数据库密码")
    private String databasePassword;


    /**
     * 创建人
     */
    @ApiModelProperty(value = "创建人")
    private String creator;


    /**
     * 创建时间
     */
    @ApiModelProperty(value = "创建时间")
    private Date createTime;


    /**
     * 修改人
     */
    @ApiModelProperty(value = "修改人")
    private String updator;


    /**
     * 修改时间
     */
    @ApiModelProperty(value = "修改时间")
    private Date updateTime;
    /**
     * 数据源驱动名
     */
    @ApiModelProperty("数据源驱动名")
    private String driverClassName;


    private static final long serialVersionUID = 1L;
}

3、服务层应用代码

@Override
public R<MasterDataResponseBody> list(MasterDataRequestBody requestBody) throws Exception {
    ModelInfo modelInfo = modelInfoService.selectByPrimaryKey(requestBody.getModelId());
    if (Objects.isNull(modelInfo)) {
        return R.failed("");
    }
    CdcDatasourceConfig cdcDatasourceConfig = cdcDatasourceConfigMapper.selectByModelId(requestBody.getModelId());
    if (ObjectUtil.isEmpty(cdcDatasourceConfig)) {
        return R.failed("当前查询数据源不存在!");
    }
    if (1 == (requestBody.getType())) {
        //展示已启用,冻结中
        List<String> fieldList = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(requestBody.getFieldList())) {
            requestBody.getFieldList().stream().forEach(s -> {
                String field = s.getFieldName();
                fieldList.add(field);
            });
        } else {
            List<SimpleTableInfoResponse> tableInfoResponseList = modelFieldMapper.selectByModelId(requestBody.getModelId());
            if (CollectionUtils.isNotEmpty(tableInfoResponseList)) {
                tableInfoResponseList.stream().forEach(s -> {
                    String field = s.getFieldName();
                    fieldList.add(field);
                });
            }
        }
        List<ModelFieldNodeResponseBody> fieldLists = modelFieldService.listByModelId(requestBody.getModelId());
        fieldLists = fieldLists.stream().filter(s -> fieldList.contains(s.getFieldName())).collect(Collectors.toList());
        String fieldName = modelFieldMapper.selectFieldNameByModelId(requestBody.getModelId());
        List<Map<String, Object>> list = new ArrayList<>();
        //获取已启用数据
        List<String> enabledList = modelMantenerMapper.selectByModelIdAndFieldId(requestBody.getModelId(), MasterDataStateEnum.ENABLED.getValue());
        Page page = PageHelper.startPage(requestBody.getPageNum(), requestBody.getPageSize());
        if (CollectionUtils.isNotEmpty(enabledList)) {
            if (cdcDatasourceConfig.getDatasourceType().equals(MYSQL_DATASOURCE)) {
                String wFields = "";
                if (CollectionUtils.isNotEmpty(requestBody.getConditionList())) {
                    for (SearchCondition searchCondition : requestBody.getConditionList()) {
                        String sql = "";
                        if ("false".equals(searchCondition.getLikeSearch())) {
                            sql = searchCondition.getFieldName() + " = " + searchCondition.getFieldValue();
                        } else {
                            sql = searchCondition.getFieldName() + " like " + "'%" + searchCondition.getFieldValue() + "%'";
                        }
                        wFields = wFields + sql + " and ";
                    }
                }
                List<Map<String, Object>> mapList = dataSourceTypeService.selectByMySqlSourceAndFieldId(StringUtils.strip(fieldList.toString(), "[]"), modelInfo.getModelName(), cdcDatasourceConfig, wFields, fieldName, enabledList);
                mapList.stream().forEach(t -> {
                    t.put("modelDataStatus", 1);
                });
                list.addAll(mapList);
            }
            if (cdcDatasourceConfig.getDatasourceType().equals(POSTGRESQL_DATASOURCE)) {
                String wFields = "";
                if (CollectionUtils.isNotEmpty(requestBody.getConditionList())) {
                    for (SearchCondition searchCondition : requestBody.getConditionList()) {
                        String sql = "";
                        if ("false".equals(searchCondition.getLikeSearch())) {
                            sql = searchCondition.getFieldName() + " = " + searchCondition.getFieldValue();
                        } else {
                            sql = searchCondition.getFieldName() + " like " + "'%'" + " || " + searchCondition.getFieldValue() + " || " + "'%'";
                        }
                        wFields = wFields + sql + " and ";
                    }
                }
                List<Map<String, Object>> mapList = dataSourceTypeService.selectByPgSqlSourceAndFieldId(StringUtils.strip(fieldList.toString(), "[]"), modelInfo.getModelName(), cdcDatasourceConfig, wFields, fieldName, enabledList);
                mapList.stream().forEach(t -> {
                    t.put("modelDataStatus", 1);
                });
                list.addAll(mapList);
            }
        }
        //获取已冻结数据
        List<String> freezeList = modelMantenerMapper.selectByModelIdAndFieldId(requestBody.getModelId(), MasterDataStateEnum.FREEZE.getValue());
        if (CollectionUtils.isNotEmpty(freezeList)) {
            if (cdcDatasourceConfig.getDatasourceType().equals(MYSQL_DATASOURCE)) {
                String wFields = "";
                if (CollectionUtils.isNotEmpty(requestBody.getConditionList())) {
                    for (SearchCondition searchCondition : requestBody.getConditionList()) {
                        String sql = "";
                        if ("false".equals(searchCondition.getLikeSearch())) {
                            sql = searchCondition.getFieldName() + " = " + searchCondition.getFieldValue();
                        } else {
                            sql = searchCondition.getFieldName() + " like " + "'%" + searchCondition.getFieldValue() + "%'";
                        }
                        wFields = wFields + sql + " and ";
                    }
                }
                List<Map<String, Object>> mapList = dataSourceTypeService.selectByMySqlSourceAndFieldId(StringUtils.strip(fieldList.toString(), "[]"), modelInfo.getModelName(), cdcDatasourceConfig, wFields, fieldName, freezeList);
                mapList.stream().forEach(t -> {
                    t.put("modelDataStatus", 4);
                });
                list.addAll(mapList);
            }
            if (cdcDatasourceConfig.getDatasourceType().equals(POSTGRESQL_DATASOURCE)) {
                String wFields = "";
                if (CollectionUtils.isNotEmpty(requestBody.getConditionList())) {
                    for (SearchCondition searchCondition : requestBody.getConditionList()) {
                        String sql = "";
                        if ("false".equals(searchCondition.getLikeSearch())) {
                            sql = searchCondition.getFieldName() + " = " + searchCondition.getFieldValue();
                        } else {
                            sql = searchCondition.getFieldName() + " like " + "'%'" + " || " + searchCondition.getFieldValue() + " || " + "'%'";
                        }
                        wFields = wFields + sql + " and ";
                    }
                }
                List<Map<String, Object>> mapList = dataSourceTypeService.selectByPgSqlSourceAndFieldId(StringUtils.strip(fieldList.toString(), "[]"), modelInfo.getModelName(), cdcDatasourceConfig, wFields, fieldName, freezeList);
                mapList.stream().forEach(t -> {
                    t.put("modelDataStatus", 4);
                });
                list.addAll(mapList);
            }
        }
        PageInfo<Map<String, Object>> pageInfo = new PageInfo<>(list);
        //过滤掉需要隐藏的字段和数据
        List<ModelFieldNodeResponseBody> finalFieldLists = fieldLists;
        List<Map<String, Object>> dataList = list.stream().filter(o -> finalFieldLists.stream().anyMatch(t -> Objects.nonNull(o.get(t.getFieldName())) && Boolean.FALSE.equals(t.getNotDisplayed()))).collect(Collectors.toList());
        pageInfo.setTotal(page.getTotal());
        if (CollectionUtils.isNotEmpty(dataList)) {
            pageInfo.setList(dataList);
        }
        return R.ok(MasterDataResponseBody.builder()
                .pageInfo(pageInfo)
                .build());
    }
    if (2 == (requestBody.getType())) {
        //展示:未启用,已启用,冻结中
        List<String> fieldList = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(requestBody.getFieldList())) {
            requestBody.getFieldList().stream().forEach(s -> {
                String field = s.getFieldName();
                fieldList.add(field);
            });
        } else {
            List<SimpleTableInfoResponse> tableInfoResponseList = modelFieldMapper.selectByModelId(requestBody.getModelId());
            if (CollectionUtils.isNotEmpty(tableInfoResponseList)) {
                tableInfoResponseList.stream().forEach(s -> {
                    String field = s.getFieldName();
                    fieldList.add(field);
                });
            }
        }
        List<Map<String, Object>> list = new ArrayList<>();
        Page page = PageHelper.startPage(requestBody.getPageNum(), requestBody.getPageSize());
        if (cdcDatasourceConfig.getDatasourceType().equals(MYSQL_DATASOURCE)) {
            String wFields = "";
            if (CollectionUtils.isNotEmpty(requestBody.getConditionList())) {
                for (SearchCondition searchCondition : requestBody.getConditionList()) {
                    String sql = "";
                    if ("false".equals(searchCondition.getLikeSearch())) {
                        sql = searchCondition.getFieldName() + " = " + searchCondition.getFieldValue();
                    } else {
                        sql = searchCondition.getFieldName() + " like " + "'%" + searchCondition.getFieldValue() + "%'";
                    }
                    wFields = wFields + sql + " and ";
                }
            }
            list = dataSourceTypeService.selectByMySqlSource(StringUtils.strip(fieldList.toString(), "[]"), modelInfo.getModelName(), cdcDatasourceConfig, wFields);
        }
        if (cdcDatasourceConfig.getDatasourceType().equals(POSTGRESQL_DATASOURCE)) {
            String wFields = "";
            if (CollectionUtils.isNotEmpty(requestBody.getConditionList())) {
                for (SearchCondition searchCondition : requestBody.getConditionList()) {
                    String sql = "";
                    if ("false".equals(searchCondition.getLikeSearch())) {
                        sql = searchCondition.getFieldName() + " = " + searchCondition.getFieldValue();
                    } else {
                        sql = searchCondition.getFieldName() + " like " + "'%'" + " || " + searchCondition.getFieldValue() + " || " + "'%'";
                    }
                    wFields = wFields + sql + " and ";
                }
            }
            list = dataSourceTypeService.selectByPgSqlSource(StringUtils.strip(fieldList.toString(), "[]"), modelInfo.getModelName(), cdcDatasourceConfig, wFields);
        }
        PageInfo<Map<String, Object>> pageInfo = new PageInfo<>(list);
        List<ModelFieldNodeResponseBody> fieldLists = modelFieldService.listByModelId(requestBody.getModelId());
        //过滤掉需要隐藏的字段和数据
        List<ModelFieldNodeResponseBody> finalFieldLists = fieldLists;
        List<Map<String, Object>> dataList = list.stream().filter(o -> finalFieldLists.stream().anyMatch(t -> Objects.nonNull(o.get(t.getFieldName())) && Boolean.FALSE.equals(t.getNotDisplayed()))).collect(Collectors.toList());
        PageInfo<Map<String, Object>> pageInfoTmp = new PageInfo<>(page);
        BeanUtils.copyProperties(pageInfoTmp, pageInfo);
        pageInfo.setTotal(page.getTotal());
        if (CollectionUtils.isNotEmpty(dataList)) {
            dataList.stream().forEach(s -> {
                s.put("modelDataStatus", 0);
            });
        }
        pageInfo.setList(dataList);
        fieldLists = fieldLists.stream().filter(s -> fieldList.contains(s.getFieldName())).collect(Collectors.toList());
        return R.ok(MasterDataResponseBody.builder()
                .pageInfo(pageInfo)
                .build());
    }
    if (3 == (requestBody.getType())) {
        //已启用和冻结中
        List<String> fieldList = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(requestBody.getFieldList())) {
            requestBody.getFieldList().stream().forEach(s -> {
                String field = s.getFieldName();
                fieldList.add(field);
            });
        } else {
            List<SimpleTableInfoResponse> tableInfoResponseList = modelFieldMapper.selectByModelId(requestBody.getModelId());
            if (CollectionUtils.isNotEmpty(tableInfoResponseList)) {
                tableInfoResponseList.stream().forEach(s -> {
                    String field = s.getFieldName();
                    fieldList.add(field);
                });
            }
        }


        List<ModelFieldNodeResponseBody> fieldLists = modelFieldService.listByModelId(requestBody.getModelId());
        fieldLists = fieldLists.stream().filter(s -> fieldList.contains(s.getFieldName())).collect(Collectors.toList());
        String fieldName = modelFieldMapper.selectFieldNameByModelId(requestBody.getModelId());
        List<Map<String, Object>> list = new ArrayList<>();
        //获取已启用数据
        Page page = PageHelper.startPage(requestBody.getPageNum(), requestBody.getPageSize());
        List<String> enabledList = modelMantenerMapper.selectByModelIdAndFieldId(requestBody.getModelId(), MasterDataStateEnum.ENABLED.getValue());
        if (CollectionUtils.isNotEmpty(enabledList)) {
            if (cdcDatasourceConfig.getDatasourceType().equals(MYSQL_DATASOURCE)) {
                String wFields = "";
                if (CollectionUtils.isNotEmpty(requestBody.getConditionList())) {
                    for (SearchCondition searchCondition : requestBody.getConditionList()) {
                        String sql = "";
                        if ("false".equals(searchCondition.getLikeSearch())) {
                            sql = searchCondition.getFieldName() + " = " + searchCondition.getFieldValue();
                        } else {
                            sql = searchCondition.getFieldName() + " like " + "'%" + searchCondition.getFieldValue() + "%'";
                        }
                        wFields = wFields + sql + " and ";
                    }
                }
                List<Map<String, Object>> mapList = dataSourceTypeService.selectByMySqlSourceAndFieldId(StringUtils.strip(fieldList.toString(), "[]"), modelInfo.getModelName(), cdcDatasourceConfig, wFields, fieldName, enabledList);
                mapList.stream().forEach(t -> {
                    t.put("modelDataStatus", 1);
                });
                list.addAll(mapList);
            }
            if (cdcDatasourceConfig.getDatasourceType().equals(POSTGRESQL_DATASOURCE)) {
                String wFields = "";
                if (CollectionUtils.isNotEmpty(requestBody.getConditionList())) {
                    for (SearchCondition searchCondition : requestBody.getConditionList()) {
                        String sql = "";
                        if ("false".equals(searchCondition.getLikeSearch())) {
                            sql = searchCondition.getFieldName() + " = " + searchCondition.getFieldValue();
                        } else {
                            sql = searchCondition.getFieldName() + " like " + "'%'" + " || " + searchCondition.getFieldValue() + " || " + "'%'";
                        }
                        wFields = wFields + sql + " and ";
                    }
                }
                List<Map<String, Object>> mapList = dataSourceTypeService.selectByPgSqlSourceAndFieldId(StringUtils.strip(fieldList.toString(), "[]"), modelInfo.getModelName(), cdcDatasourceConfig, wFields, fieldName, enabledList);
                mapList.stream().forEach(t -> {
                    t.put("modelDataStatus", 1);
                });
                list.addAll(mapList);
            }
        }
        //获取已冻结数据
        List<String> freezeList = modelMantenerMapper.selectByModelIdAndFieldId(requestBody.getModelId(), MasterDataStateEnum.FREEZE.getValue());
        if (CollectionUtils.isNotEmpty(freezeList)) {
            if (cdcDatasourceConfig.getDatasourceType().equals(MYSQL_DATASOURCE)) {
                String wFields = "";
                if (CollectionUtils.isNotEmpty(requestBody.getConditionList())) {
                    for (SearchCondition searchCondition : requestBody.getConditionList()) {
                        String sql = "";
                        if ("false".equals(searchCondition.getLikeSearch())) {
                            sql = searchCondition.getFieldName() + " = " + searchCondition.getFieldValue();
                        } else {
                            sql = searchCondition.getFieldName() + " like " + "'%" + searchCondition.getFieldValue() + "%'";
                        }
                        wFields = wFields + sql + " and ";
                    }
                }
                List<Map<String, Object>> mapList = dataSourceTypeService.selectByMySqlSourceAndFieldId(StringUtils.strip(fieldList.toString(), "[]"), modelInfo.getModelName(), cdcDatasourceConfig, wFields, fieldName, freezeList);
                mapList.stream().forEach(t -> {
                    t.put("modelDataStatus", 4);
                });
                list.addAll(mapList);
            }
            if (cdcDatasourceConfig.getDatasourceType().equals(POSTGRESQL_DATASOURCE)) {
                String wFields = "";
                if (CollectionUtils.isNotEmpty(requestBody.getConditionList())) {
                    for (SearchCondition searchCondition : requestBody.getConditionList()) {
                        String sql = "";
                        if ("false".equals(searchCondition.getLikeSearch())) {
                            sql = searchCondition.getFieldName() + " = " + searchCondition.getFieldValue();
                        } else {
                            sql = searchCondition.getFieldName() + " like " + "'%'" + " || " + searchCondition.getFieldValue() + " || " + "'%'";
                        }
                        wFields = wFields + sql + " and ";
                    }
                }
                List<Map<String, Object>> mapList = dataSourceTypeService.selectByPgSqlSourceAndFieldId(StringUtils.strip(fieldList.toString(), "[]"), modelInfo.getModelName(), cdcDatasourceConfig, wFields, fieldName, freezeList);
                mapList.stream().forEach(t -> {
                    t.put("modelDataStatus", 4);
                });
                list.addAll(mapList);
            }
        }
        PageInfo<Map<String, Object>> pageInfo = new PageInfo<>(list);
        //过滤掉需要隐藏的字段和数据
        List<ModelFieldNodeResponseBody> finalFieldLists = fieldLists;
        List<Map<String, Object>> dataList = list.stream().filter(o -> finalFieldLists.stream().anyMatch(t -> Objects.nonNull(o.get(t.getFieldName())) && Boolean.FALSE.equals(t.getNotDisplayed()))).collect(Collectors.toList());
        pageInfo.setTotal(page.getTotal());
        if (CollectionUtils.isNotEmpty(dataList)) {
            pageInfo.setList(dataList);
        }
        return R.ok(MasterDataResponseBody.builder()
                .pageInfo(pageInfo)
                .build());
    }
    if (4 == (requestBody.getType())) {
        //审批中
        List<String> fieldList = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(requestBody.getFieldList())) {
            requestBody.getFieldList().stream().forEach(s -> {
                String field = s.getFieldName();
                fieldList.add(field);
            });
        } else {
            List<SimpleTableInfoResponse> tableInfoResponseList = modelFieldMapper.selectByModelId(requestBody.getModelId());
            if (CollectionUtils.isNotEmpty(tableInfoResponseList)) {
                tableInfoResponseList.stream().forEach(s -> {
                    String field = s.getFieldName();
                    fieldList.add(field);
                });
            }
        }
        List<ModelFieldNodeResponseBody> fieldLists = modelFieldService.listByModelId(requestBody.getModelId());
        fieldLists = fieldLists.stream().filter(s -> fieldList.contains(s.getFieldName())).collect(Collectors.toList());
        String fieldName = modelFieldMapper.selectFieldNameByModelId(requestBody.getModelId());
        List<String> fieldIdList = modelMantenerMapper.selectByModelIdAndFieldId(requestBody.getModelId(), MasterDataStateEnum.ENABLED_AUDITING.getValue());
        if (CollectionUtils.isNotEmpty(fieldIdList)) {
            Page page = PageHelper.startPage(requestBody.getPageNum(), requestBody.getPageSize());
            List<Map<String, Object>> list = new ArrayList<>();
            if (cdcDatasourceConfig.getDatasourceType().equals(MYSQL_DATASOURCE)) {
                String wFields = "";
                if (CollectionUtils.isNotEmpty(requestBody.getConditionList())) {
                    for (SearchCondition searchCondition : requestBody.getConditionList()) {
                        String sql = "";
                        if ("false".equals(searchCondition.getLikeSearch())) {
                            sql = searchCondition.getFieldName() + " = " + searchCondition.getFieldValue();
                        } else {
                            sql = searchCondition.getFieldName() + " like " + "'%" + searchCondition.getFieldValue() + "%'";
                        }
                        wFields = wFields + sql + " and ";
                    }
                }
                list = dataSourceTypeService.selectByMySqlSourceAndFieldId(StringUtils.strip(fieldList.toString(), "[]"), modelInfo.getModelName(), cdcDatasourceConfig, wFields, fieldName, fieldIdList);
                list.stream().forEach(t -> {
                    t.put("modelDataStatus", 2);
                });
            }
            if (cdcDatasourceConfig.getDatasourceType().equals(POSTGRESQL_DATASOURCE)) {
                String wFields = "";
                if (CollectionUtils.isNotEmpty(requestBody.getConditionList())) {
                    for (SearchCondition searchCondition : requestBody.getConditionList()) {
                        String sql = "";
                        if ("false".equals(searchCondition.getLikeSearch())) {
                            sql = searchCondition.getFieldName() + " = " + searchCondition.getFieldValue();
                        } else {
                            sql = searchCondition.getFieldName() + " like " + "'%'" + " || " + searchCondition.getFieldValue() + " || " + "'%'";
                        }
                        wFields = wFields + sql + " and ";
                    }
                }
                list = dataSourceTypeService.selectByPgSqlSourceAndFieldId(StringUtils.strip(fieldList.toString(), "[]"), modelInfo.getModelName(), cdcDatasourceConfig, wFields, fieldName, fieldIdList);
                list.stream().forEach(t -> {
                    t.put("modelDataStatus", 2);
                });
            }
            PageInfo<Map<String, Object>> pageInfo = new PageInfo<>(list);
            //过滤掉需要隐藏的字段和数据
            List<ModelFieldNodeResponseBody> finalFieldLists = fieldLists;
            List<Map<String, Object>> dataList = list.stream().filter(o -> finalFieldLists.stream().anyMatch(t -> Objects.nonNull(o.get(t.getFieldName())) && Boolean.FALSE.equals(t.getNotDisplayed()))).collect(Collectors.toList());
            PageInfo<Map<String, Object>> pageInfoTmp = new PageInfo<>(page);
            BeanUtils.copyProperties(pageInfoTmp, pageInfo);
            pageInfo.setTotal(page.getTotal());
            pageInfo.setList(dataList);
            return R.ok(MasterDataResponseBody.builder()
                    .pageInfo(pageInfo)
                    .build());
        }
        return R.ok(MasterDataResponseBody.builder()
                .pageInfo(null)
                .build());
    }
    return R.ok();
}

4、语法数据源接口层

package com.gennlife.datamap.masterdata.service;


import com.gennlife.datamap.masterdata.po.CdcDatasourceConfig;


import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;


/**
 * @author: lyk
 * @Email: liyukai@gennlife.com
 * @Description:
 * @date: 2022/1/19 2:50 下午
 * @Version V1.0
 */
public interface DataSourceTypeService {
    List<Map<String, Object>> selectByMySqlSource(String strip, String modelName, CdcDatasourceConfig cdcDatasourceConfig, String wFields);


    List<Map<String, Object>> selectByPgSqlSource(String strip, String modelName, CdcDatasourceConfig cdcDatasourceConfig, String wFields);


    void saveMysqlSource(String batchInsertSql, CdcDatasourceConfig cdcDatasourceConfig);


    void savePgSqlSource(String batchInsertSql, CdcDatasourceConfig cdcDatasourceConfig);


    List<Map<String, Object>> selectByMySqlSourceAndFieldId(String strip, String modelName, CdcDatasourceConfig cdcDatasourceConfig, String wFields, String fieldName, List<String> fieldIdList);


    List<Map<String, Object>> selectByPgSqlSourceAndFieldId(String strip, String modelName, CdcDatasourceConfig cdcDatasourceConfig, String wFields, String fieldName, List<String> fieldIdList);


    List<Map<String, Object>> selectByMySqlFieldDataId(String strip, String modelName, CdcDatasourceConfig cdcDatasourceConfig, String fieldName, List<String> masterDataIds);


    List<Map<String, Object>> selectByPgSqlFieldDataId(String strip, String modelName, CdcDatasourceConfig cdcDatasourceConfig, String fieldName, List<String> masterDataIds);


    void insertMySqlSingleQuantity(String strip, CdcDatasourceConfig cdcDatasourceConfig);


    void insertPgSqlSingleQuantity(String strip, CdcDatasourceConfig cdcDatasourceConfig);


    void updateMySqlSingleQuantity(String updateSql, CdcDatasourceConfig cdcDatasourceConfig);


    void updatePgSqlSingleQuantity(String updateSql, CdcDatasourceConfig cdcDatasourceConfig);
}

5、语法数据源逻辑层

package com.gennlife.datamap.masterdata.service.impl;


import com.alibaba.fastjson.JSON;
import com.gennlife.datamap.masterdata.common.constant.SystemConstants;
import com.gennlife.datamap.masterdata.common.dbconfig.DynamicDataSourceConfig;
import com.gennlife.datamap.masterdata.dao.datatype.CDCMySqlMapper;
import com.gennlife.datamap.masterdata.dao.datatype.CDCPgSqlMapper;
import com.gennlife.datamap.masterdata.po.CdcDatasourceConfig;
import com.gennlife.datamap.masterdata.service.DataSourceTypeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Set;


/**
 * @author: lyk
 * @Email: liyukai@gennlife.com
 * @Description: 语法数据源逻辑类
 * @date: 2022/1/19 2:50 下午
 * @Version V1.0
 */
@Slf4j
@Service
public class DataSourceTypeServiceImpl implements DataSourceTypeService {
    @Autowired
    DynamicDataSourceConfig dynamicDataSourceConfig;
    @Resource
    CDCMySqlMapper cdcMySqlMapper;
    @Resource
    CDCPgSqlMapper cdcPgSqlMapper;


    /**
     * mysql语法数据源业务查询
     *
     * @param strip
     * @param modelName
     * @param cdcDatasourceConfig
     * @param wFields
     * @return
     */
    @Override
    public List<Map<String, Object>> selectByMySqlSource(String strip, String modelName, CdcDatasourceConfig cdcDatasourceConfig, String wFields) {
        cdcDatasourceConfig.setDriverClassName(SystemConstants.MYSQL_DRIVER_CLASSNAME);
        Set<String> addDataSource = dynamicDataSourceConfig.add(cdcDatasourceConfig);
        log.info("当前已增加数据源为:" + JSON.toJSON(addDataSource));
        List<Map<String, Object>> list = cdcMySqlMapper.selectByDataSourceId(strip, modelName, wFields);
        String dataSourceName = dynamicDataSourceConfig.remove(cdcDatasourceConfig.getDatasourceType());
        log.info("当前已删除数据源为:" + dataSourceName);
        return list;
    }


    @Override
    public List<Map<String, Object>> selectByMySqlSourceAndFieldId(String strip, String modelName, CdcDatasourceConfig cdcDatasourceConfig, String wFields, String fieldName, List<String> fieldIdList) {
        cdcDatasourceConfig.setDriverClassName(SystemConstants.MYSQL_DRIVER_CLASSNAME);
        Set<String> addDataSource = dynamicDataSourceConfig.add(cdcDatasourceConfig);
        log.info("当前已增加数据源为:" + JSON.toJSON(addDataSource));
        List<Map<String, Object>> list = cdcMySqlMapper.selectByMySqlSourceAndFieldId(strip, modelName, wFields, fieldName, fieldIdList);
        String dataSourceName = dynamicDataSourceConfig.remove(cdcDatasourceConfig.getDatasourceType());
        log.info("当前已删除数据源为:" + dataSourceName);
        return list;
    }


    @Override
    public List<Map<String, Object>> selectByPgSqlSourceAndFieldId(String strip, String modelName, CdcDatasourceConfig cdcDatasourceConfig, String wFields, String fieldName, List<String> fieldIdList) {
        cdcDatasourceConfig.setDriverClassName(SystemConstants.POSTGRESQL_DRIVER_CLASSNAME);
        Set<String> addDataSource = dynamicDataSourceConfig.add(cdcDatasourceConfig);
        log.info("当前已增加数据源为:" + JSON.toJSON(addDataSource));
        List<Map<String, Object>> list = cdcPgSqlMapper.selectByPgSqlSourceAndFieldId(strip, modelName, wFields, fieldName, fieldIdList);
        String dataSourceName = dynamicDataSourceConfig.remove(cdcDatasourceConfig.getDatasourceType());
        log.info("当前已删除数据源为:" + dataSourceName);
        return list;
    }


    @Override
    public List<Map<String, Object>> selectByMySqlFieldDataId(String strip, String modelName, CdcDatasourceConfig cdcDatasourceConfig, String fieldName, List<String> masterDataIds) {
        cdcDatasourceConfig.setDriverClassName(SystemConstants.MYSQL_DRIVER_CLASSNAME);
        Set<String> addDataSource = dynamicDataSourceConfig.add(cdcDatasourceConfig);
        log.info("当前已增加数据源为:" + JSON.toJSON(addDataSource));
        List<Map<String, Object>> list = cdcMySqlMapper.selectByMySqlFieldDataId(strip, modelName, fieldName, masterDataIds);
        String dataSourceName = dynamicDataSourceConfig.remove(cdcDatasourceConfig.getDatasourceType());
        log.info("当前已删除数据源为:" + dataSourceName);
        return list;
    }


    @Override
    public List<Map<String, Object>> selectByPgSqlFieldDataId(String strip, String modelName, CdcDatasourceConfig cdcDatasourceConfig, String fieldName, List<String> masterDataIds) {
        cdcDatasourceConfig.setDriverClassName(SystemConstants.POSTGRESQL_DRIVER_CLASSNAME);
        Set<String> addDataSource = dynamicDataSourceConfig.add(cdcDatasourceConfig);
        log.info("当前已增加数据源为:" + JSON.toJSON(addDataSource));
        List<Map<String, Object>> list = cdcPgSqlMapper.selectByPgSqlFieldDataId(strip, modelName, fieldName, masterDataIds);
        String dataSourceName = dynamicDataSourceConfig.remove(cdcDatasourceConfig.getDatasourceType());
        log.info("当前已删除数据源为:" + dataSourceName);
        return list;
    }


    @Override
    public void insertMySqlSingleQuantity(String strip, CdcDatasourceConfig cdcDatasourceConfig) {
        cdcDatasourceConfig.setDriverClassName(SystemConstants.MYSQL_DRIVER_CLASSNAME);
        Set<String> addDataSource = dynamicDataSourceConfig.add(cdcDatasourceConfig);
        log.info("当前已增加数据源为:" + JSON.toJSON(addDataSource));
        cdcMySqlMapper.insertMySqlSingleQuantity(strip);
        String dataSourceName = dynamicDataSourceConfig.remove(cdcDatasourceConfig.getDatasourceType());
        log.info("当前已删除数据源为:" + dataSourceName);
    }


    @Override
    public void insertPgSqlSingleQuantity(String strip, CdcDatasourceConfig cdcDatasourceConfig) {
        cdcDatasourceConfig.setDriverClassName(SystemConstants.POSTGRESQL_DRIVER_CLASSNAME);
        Set<String> addDataSource = dynamicDataSourceConfig.add(cdcDatasourceConfig);
        log.info("当前已增加数据源为:" + JSON.toJSON(addDataSource));
        cdcPgSqlMapper.insertPgSqlSingleQuantity(strip);
        String dataSourceName = dynamicDataSourceConfig.remove(cdcDatasourceConfig.getDatasourceType());
        log.info("当前已删除数据源为:" + dataSourceName);
    }


    @Override
    public void updateMySqlSingleQuantity(String updateSql, CdcDatasourceConfig cdcDatasourceConfig) {
        cdcDatasourceConfig.setDriverClassName(SystemConstants.MYSQL_DRIVER_CLASSNAME);
        Set<String> addDataSource = dynamicDataSourceConfig.add(cdcDatasourceConfig);
        log.info("当前已增加数据源为:" + JSON.toJSON(addDataSource));
        cdcMySqlMapper.updateMySqlSingleQuantity(updateSql);
        String dataSourceName = dynamicDataSourceConfig.remove(cdcDatasourceConfig.getDatasourceType());
        log.info("当前已删除数据源为:" + dataSourceName);
    }


    @Override
    public void updatePgSqlSingleQuantity(String updateSql, CdcDatasourceConfig cdcDatasourceConfig) {
        cdcDatasourceConfig.setDriverClassName(SystemConstants.POSTGRESQL_DRIVER_CLASSNAME);
        Set<String> addDataSource = dynamicDataSourceConfig.add(cdcDatasourceConfig);
        log.info("当前已增加数据源为:" + JSON.toJSON(addDataSource));
        cdcPgSqlMapper.updatePgSqlSingleQuantity(updateSql);
        String dataSourceName = dynamicDataSourceConfig.remove(cdcDatasourceConfig.getDatasourceType());
        log.info("当前已删除数据源为:" + dataSourceName);
    }




    /**
     * pgsql语法数据源业务查询
     *
     * @param strip
     * @param modelName
     * @param cdcDatasourceConfig
     * @param wFields
     * @return
     */
    @Override
    public List<Map<String, Object>> selectByPgSqlSource(String strip, String modelName, CdcDatasourceConfig cdcDatasourceConfig, String wFields) {
        cdcDatasourceConfig.setDriverClassName(SystemConstants.POSTGRESQL_DRIVER_CLASSNAME);
        Set<String> addDataSource = dynamicDataSourceConfig.add(cdcDatasourceConfig);
        log.info("当前已增加数据源为:" + JSON.toJSON(addDataSource));
        List<Map<String, Object>> list = cdcPgSqlMapper.selectByDataSourceId(strip, modelName, wFields);
        String dataSourceName = dynamicDataSourceConfig.remove(cdcDatasourceConfig.getDatasourceType());
        log.info("当前已删除数据源为:" + dataSourceName);
        return list;
    }


    /**
     * mysql语法数据源业务入库
     *
     * @param batchInsertSql
     * @param cdcDatasourceConfig
     */
    @Override
    public void saveMysqlSource(String batchInsertSql, CdcDatasourceConfig cdcDatasourceConfig) {
        cdcDatasourceConfig.setDriverClassName(SystemConstants.MYSQL_DRIVER_CLASSNAME);
        Set<String> addDataSource = dynamicDataSourceConfig.add(cdcDatasourceConfig);
        log.info("当前已增加数据源为:" + JSON.toJSON(addDataSource));
        cdcMySqlMapper.batchInsert(batchInsertSql);
        String dataSourceName = dynamicDataSourceConfig.remove(cdcDatasourceConfig.getDatasourceType());
        log.info("当前已删除数据源为:" + dataSourceName);
    }


    /**
     * pgsql语法数据源业务入库
     *
     * @param batchInsertSql
     * @param cdcDatasourceConfig
     */
    @Override
    public void savePgSqlSource(String batchInsertSql, CdcDatasourceConfig cdcDatasourceConfig) {
        cdcDatasourceConfig.setDriverClassName(SystemConstants.POSTGRESQL_DRIVER_CLASSNAME);
        Set<String> addDataSource = dynamicDataSourceConfig.add(cdcDatasourceConfig);
        log.info("当前已增加数据源为:" + JSON.toJSON(addDataSource));
        cdcPgSqlMapper.batchInsert(batchInsertSql);
        String dataSourceName = dynamicDataSourceConfig.remove(cdcDatasourceConfig.getDatasourceType());
        log.info("当前已删除数据源为:" + dataSourceName);
    }

}

6、mysql语法数据源Mapper层

package com.gennlife.datamap.masterdata.dao.datatype;


import com.baomidou.dynamic.datasource.annotation.DS;
import com.gennlife.datamap.masterdata.common.constant.SystemConstants;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;


import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;


/**
 * @author: lyk
 * @Email: liyukai@gennlife.com
 * @Description: mysql语法数据源
 * @date: 2022/1/13 4:53 下午
 * @Version V1.0
 */
@Mapper
public interface CDCMySqlMapper {


    @DS(SystemConstants.MYSQL_DATASOURCE)
    List<Map<String, Object>> selectByDataSourceId(@Param("fields") String fields, @Param("tableName") String tableName, @Param("wFields") String wFields);




    @DS(SystemConstants.MYSQL_DATASOURCE)
    void batchInsert(@Param("batchInsertSql") String batchInsertSql);


    @DS(SystemConstants.MYSQL_DATASOURCE)
    List<Map<String, Object>> selectByMySqlSourceAndFieldId(@Param("fields") String fields, @Param("tableName") String tableName, @Param("wFields") String wFields, @Param("fieldName") String fieldName, @Param("list") List<String> list);


    @DS(SystemConstants.MYSQL_DATASOURCE)
    List<Map<String, Object>> selectByMySqlFieldDataId(@Param("fields") String fields, @Param("tableName") String tableName, @Param("fieldName") String fieldName, @Param("list") List<String> list);


    @DS(SystemConstants.MYSQL_DATASOURCE)
    int insertMySqlSingleQuantity(@Param("fields") String fields);


    @DS(SystemConstants.MYSQL_DATASOURCE)
    int updateMySqlSingleQuantity(@Param("fields") String fields);
}


7、mysql语法数据源Xml层

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.gennlife.datamap.masterdata.dao.datatype.CDCMySqlMapper">
    <insert id="batchInsert">
        ${batchInsertSql}
    </insert>
    <insert id="insertMySqlSingleQuantity">
       ${fields}
    </insert>
    <update id="updateMySqlSingleQuantity">
        ${fields}
    </update>


    <select id="selectByDataSourceId" resultType="java.util.LinkedHashMap">
        SELECT ${fields}
        FROM ${tableName}
        WHERE ${wFields} 1=1
    </select>
    <select id="selectByMySqlSourceAndFieldId" resultType="java.util.LinkedHashMap">
        SELECT ${fields}
        FROM ${tableName}
        WHERE ${wFields} 1=1 and ${fieldName} IN (
        <foreach collection="list" item="item"
                 index="index" separator=",">
            #{item}
        </foreach>
        )
    </select>


    <select id="selectByMySqlFieldDataId" resultType="java.util.LinkedHashMap">
        SELECT ${fields}
        FROM ${tableName}
        WHERE 1=1
        <if test="list.size()>0 ">
            and ${fieldName} IN (
            <foreach collection="list" item="item"
                     index="index" separator=",">
                #{item}
            </foreach>
            )
        </if>
    </select>
</mapper>

8、pgsql语法数据源Mapper层

package com.gennlife.datamap.masterdata.dao.datatype;


import com.baomidou.dynamic.datasource.annotation.DS;
import com.gennlife.datamap.masterdata.common.constant.SystemConstants;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;


import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;


/**
 * @author: lyk
 * @Email: liyukai@gennlife.com
 * @Description: pgsql语法数据源
 * @date: 2022/1/19 2:29 下午
 * @Version V1.0
 */
@Mapper
public interface CDCPgSqlMapper {


    @DS(SystemConstants.POSTGRESQL_DATASOURCE)
    List<Map<String, Object>> selectByDataSourceId(@Param("strip") String strip, @Param("modelName") String modelName, @Param("wFields") String wFields);


    @DS(SystemConstants.POSTGRESQL_DATASOURCE)
    int batchInsert(@Param("batchInsertSql") String batchInsertSql);


    @DS(SystemConstants.POSTGRESQL_DATASOURCE)
    List<Map<String, Object>> selectByPgSqlSourceAndFieldId(@Param("fields") String fields, @Param("tableName") String tableName, @Param("wFields") String wFields, @Param("fieldName") String fieldName, @Param("list") List<String> list);


    @DS(SystemConstants.POSTGRESQL_DATASOURCE)
    List<Map<String, Object>> selectByPgSqlFieldDataId(@Param("fields") String fields, @Param("tableName") String tableName, @Param("fieldName") String fieldName, @Param("list") List<String> list);


    @DS(SystemConstants.POSTGRESQL_DATASOURCE)
    int insertPgSqlSingleQuantity(@Param("fields") String fields);


    @DS(SystemConstants.POSTGRESQL_DATASOURCE)
    int updatePgSqlSingleQuantity(@Param("fields") String fields);
}

9、pgsql语法数据源Xml层

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.gennlife.datamap.masterdata.dao.datatype.CDCPgSqlMapper">
    <update id="updatePgSqlSingleQuantity">
        ${fields}
    </update>
    <select id="selectByDataSourceId" resultType="java.util.LinkedHashMap">
        SELECT ${fields}
        FROM ${tableName}
        WHERE ${wFields} 1=1
    </select>


    <select id="selectByPgSqlSourceAndFieldId" resultType="java.util.LinkedHashMap">
        SELECT ${fields}
        FROM ${tableName}
        WHERE ${wFields} 1=1 and ${fieldName} IN (
        <foreach collection="list" item="item" index="index"
                 separator=",">
            #{item}
        </foreach>
        )
    </select>


    <insert id="batchInsert">
        ${batchInsertSql}
    </insert>
    <insert id="insertPgSqlSingleQuantity">
        ${fields}
    </insert>


    <select id="selectByPgSqlFieldDataId" resultType="java.util.LinkedHashMap">
        SELECT ${fields}
        FROM ${tableName}
        WHERE 1=1
        <if test="list.size()>0 ">
            and ${fieldName} IN (
            <foreach collection="list" item="item" index="index"
                     separator=",">
                #{item}
            </foreach>
            )
        </if>
    </select>
</mapper>