当前位置: 首页 > article >正文

基于minio,上传sql文件后,使用通用查询接口查询并返回

基于minio,上传sql文件后,使用通用查询接口查询并返回

controller

    /**
     * 通用查询
     */
    @ApiOperation(value = "通用查询", notes = "通用查询")
    @PostMapping({"/smartQuery"})
    public R<SmartQueryResultDTO> smartQuery(@RequestBody SmartQueryDTO queryDTO) {
        /*
        3段参数:	固定存放地址的sql脚本文件名(minio)、数据库名(应用名)、参数对象(个数不定)
	        思路:
		        1、获取到sql文件并读取内容
		        2、拼接成完整sql
		        3、执行sql
         */
         
        //应用名称(用于匹配数据库名)
        String appName = queryDTO.getAppName();
        ArgumentAssert.notBlank(appName, "应用名称 不能为空");
        
        //sql文件名
        String sqlFileName = queryDTO.getSqlFileName();
        ArgumentAssert.notBlank(sqlFileName, "sql文件名 不能为空");
        
        //参数集合(会按顺序传入sql文件)
        List<String> paramList = queryDTO.getParamList();

        //1、获取到sql文件并读取内容:读取minio中指定bucket下面指定文件名的文件中的内容
        QueryFileDTO queryFileDTO = new QueryFileDTO();
        queryFileDTO.setBucketName("sqlfile");
        queryFileDTO.setObjectName(sqlFileName);
        R<String> stringR = fileApi.readFileContext(queryFileDTO);
        ArgumentAssert.isTrue(stringR.getIsSuccess(), "远程调用文件服务失败");
        String sql = stringR.getData();
        log.info("文件中的sql:{}", sql);

        //2、拼接成完整sql
        if (CollectionUtil.isNotEmpty(paramList)) {
            /*for (String param : paramList) {
                sql = sql.replaceFirst(CommonConstant.SQL_PARAM, param);
            }*/

            //先创建一个MessageFormat实例
            MessageFormat messageFormat = new MessageFormat(sql);
            //再执行format()进行格式化操作
            String[] paramArr = paramList.toArray(new String[]{});
            sql = messageFormat.format(paramArr);
        }
        ArgumentAssert.isFalse(sql.contains("{"),
                "经过参数替换,sql任然含有未替换的地方,目前的sql:" + sql);
        log.info("替换参数后的完整sql:{}", sql);

        //3、执行sql
        List<Map<String, Object>> list = new ArrayList<>();
        if (StringUtils.isNotBlank(sql)) {
            ContextUtil.setTenant(appName);
            list = commonMaper.queryBySql(sql);
        }

        SmartQueryResultDTO resultDTO = new SmartQueryResultDTO();
        resultDTO.setDataList(list);
        resultDTO.setTotal(list.size());
        return R.success(resultDTO);
    }

参数DTO

package gov.minhang.aqrcode.common.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.List;

/**
 * 通用查询DTO
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = false)
@Builder
@ApiModel(value = "SmartQueryDTO", description = "通用查询DTO")
public class SmartQueryDTO implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 应用名称(用于匹配数据库名)
     */
    @ApiModelProperty(value = "应用名称(用于匹配数据库名)")
    private String appName;

    /**
     * sql文件名
     */
    @ApiModelProperty(value = "sql文件名")
    private String sqlFileName;

    /**
     * 参数集合(按顺序传入sql文件)
     */
    @ApiModelProperty(value = "参数集合(按顺序传入sql文件)")
    private List<String> paramList;
}

Mapper.java

    /**
     * 根据完整的sql语句进行查询
     */
    @Select("${completeSql}")
    List<Map<String, Object>> queryBySql(@Param("completeSql") String completeSql);

文件读取Controller

    @ApiOperation(value = "读取文本文件中的内容")
    @PostMapping({"/readFileContext"})
    public R<String> readFileContext(@RequestBody QueryFileDTO dto) {
        String result = null;

        //获取文件流
        InputStream inputStream = fileContext.getFileStream(dto);
        if (inputStream != null) {
            //转String
            result = new BufferedReader(new InputStreamReader(inputStream))
                    .lines().collect(Collectors.joining(System.lineSeparator()));
        }

        return this.success(result);
    }

文件读取的实现细节

FileContext ----------------------------------------
    /**
     * 获取文件流
     */
    public InputStream getFileStream(QueryFileDTO dto) {
        FileStrategy fileStrategy = getFileStrategy(FileStorageType.MIN_IO);
        return fileStrategy.getFile(dto);
    }
    private FileStrategy getFileStrategy(FileStorageType storageType) {
        storageType = storageType == null ? fileServerProperties.getStorageType() : storageType;
        FileStrategy fileStrategy = contextStrategyMap.get(storageType.name());
        ArgumentAssert.notNull(fileStrategy, "请配置正确的文件存储类型");
        return fileStrategy;
    } 

FileStrategy ----------------------------------------
    /**
     * 获取文件流 (ps:暂时只实现了minio)
     */
    InputStream getFile(QueryFileDTO dto);
    
MinIoFileStrategyImpl ----------------------------------------
    /**
     * 获取文件流
     */
    @Override
    public InputStream getFile(QueryFileDTO dto) {
        GetObjectArgs build = GetObjectArgs.builder()
                .bucket(dto.getBucketName())
                .object(dto.getObjectName())
                .build();

        try {
            return minioClient.getObject(build);
        } catch (Exception e) {
            log.info(e.getMessage(), e);
            throw new BizException(e.getMessage());
        }
    }


http://www.kler.cn/news/150223.html

相关文章:

  • 数据结构-02-链表
  • 对二分搜索的理解 Go语言版
  • 从 Elasticsearch 到 SelectDB,观测云实现日志存储与分析的 10 倍性价比提升
  • 智能化质量控制,三坐标尺寸SPC管理系统引领制造新潮流!
  • sqli-labs靶场详解(less32-less37)
  • 什么是主机安全,有什么作用?
  • Android Studio Giraffe-2022.3.1-Patch-3安装注意事项
  • @Value和@ConfigurationProperties的区别,以及@ConfigurationProperties的配置依赖
  • 详解前后端交互时PO,DTO,VO模型类的应用场景
  • [论文阅读]CT3D——逐通道transformer改进3D目标检测
  • RK3568平台开发系列讲解(Linux系统篇)通过OF函数获取设备树节点实验
  • 云时空社会化商业 ERP 系统 service SQL 注入漏洞复现
  • mySQL踩坑记录
  • 【科技素养】蓝桥杯STEMA 科技素养组模拟练习试卷12
  • 从零构建属于自己的GPT系列1:文本数据预处理、文本数据tokenizer、逐行代码解读
  • SparkSQL远程调试(IDEA)
  • 深入了解Jackson库中的ObjectMapper:Java对象的序列化和反序列化
  • qt 简单了解QHBoxLayout QVBoxLayout QFormLayout水平,垂直,表单布局管理器.
  • BUUCTF刷题之路-pwn-ciscn_2019_n_81
  • Elasticsearch 聚合查询(Aggregation)详解
  • 虚拟机指定开放数据库3306端口
  • Golang开发之------ Beego框架
  • 异步操作的方法
  • genimage 打包镜像
  • ESP32-Web-Server编程- WebSocket 编程
  • leetcode二叉树
  • Spring Boot项目Service类单元测试自动生成
  • TikTok区块链实践:数字社交媒体的去中心化未来
  • 记录一次登录相关bug
  • Hive_last_value()