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));
}
结果(这里只是大致使用流程,如果后期接触数据场景,建议深入研究下底层源码):
最后附件:(详细业务代码应用)
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>