不同数据源的数据进行比对(手写oracle数据库连接和分页)

业务场景

主数据系统使用的是mysql数据库,需要访问其他系统(使用的是oracle数据库)数据库,以oracle数据库数据为基准进行对数据分组统计比对。

技术分析

由于连接的数据源并不多,因此没有把dynamic-datasource动态多数据源技术方案引入进来,这是使用的是纯原生手写oracle数据库连接并手写分页效果实现

功能实现

1、引入maven

<dependency><groupId>com.oracle.database.jdbc</groupId><artifactId>ojdbc6</artifactId><version>11.2.0.4</version><scope>runtime</scope>
</dependency>

2、controller

	/*** 主数据与其他数据源比对* @param diffQueryDTO* @return*/@PostMapping("/compareDataDiffListPage")@ApiOperation(value = "主数据与杜巴特数据比对--组织/用户-分页集合", response = DiffResultVO.class)public R<DiffResultVO> compareDataDiffListPage(@RequestBody DiffQueryDTO diffQueryDTO) {DiffResultVO result = iDataProcessService.compareDataDiffListPage(diffQueryDTO);return R.data(result,"主数据与杜巴特数据比对--组织/用户查询成功!");}

模拟分页数据返回封装

@Data
public class DiffResultVO {/*** 总数*/private Integer total;/*** 分页数据*/List<DiffVO> resultPage;}

分页差异数据

@Data
public class DiffVO {/*** 分包商编码*/private String manufacturerCode;/*** 分包商名称*/private String manufacturerName;/*** 数据类型 0:组织 1:用户*/private Integer dataType;/*** 杜巴特(数量)*/private Integer dubateCount;/*** 主数据(数量)*/private Integer maindataCount;/*** 差异数*/private Integer diffCount;//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>差异明细>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>/*** 组织差异infos*/private List<InstitutionVO> institutionDiffInfos;/*** 用户差异infos*/private List<StaffVO> staffDiffInfos;
}

分页查询入参封装

@Data
public class DiffQueryDTO {/*** 分页查询的参数,当前页数*/private Integer pageNum = 1;/*** 分页查询的参数,当前页面每页显示的数量*/private Integer pageSize = 10;/*** 分包商编码*/private String manufacturerCode;/*** 分包商名称*/private String manufacturerName;/*** 数据类型 0:组织 1:用户*/private Integer dataType;
}

3、serviceImpl

private static String USERNAMR = "XXX";
private static String PASSWORD = "XXXX";
private static String DRVIER = "oracle.jdbc.OracleDriver";
private static String URL = "jdbc:oracle:thin:@127.0.0.1:1521:XXX";
	@Overridepublic DiffResultVO compareDataDiffListPage(DiffQueryDTO diffQueryDTO) {DiffResultVO result = new DiffResultVO();List<DiffVO> resultPage = new ArrayList<>();Integer totalNum = 0;Integer pageNum = diffQueryDTO.getPageNum();Integer pageSize = diffQueryDTO.getPageSize();//计算分页Integer startNum = (pageNum*pageSize);Integer endNum = (pageNum - 1)*pageSize;String manufacturerName = diffQueryDTO.getManufacturerName();String manufacturerCode = diffQueryDTO.getManufacturerCode();Integer dataType = diffQueryDTO.getDataType();if(dataType == null){throw new SinomaException("入参数据类型不能为空,请核实!");}Connection connection = null;PreparedStatement pstm = null;ResultSet rs = null;if(dataType == 0){//组织//查询其他数据源数据>>>以其他数据源库为分页标准try {//DBUtils工具类在下方connection = DBUtils.getConnection(DRVIER, URL, USERNAMR, PASSWORD); if(connection == null){throw new SinomaException("获取数据库连接失败,请核实!");}//总数sqlString countSql = "SELECT COUNT(1) AS total FROM (SELECT DISTINCT ORG_ID, CODE as manufacturer_code,NAME as manufacturer_name FROM BUCP.FBS_V_ORG \n" +"WHERE unity  = '公司'  \n";StringBuilder countSb = new StringBuilder();countSb.append(countSql);if(StringUtils.isNotBlank(manufacturerName)){countSb.append("AND name like '%"+manufacturerName+"%' \n");}if(StringUtils.isNotBlank(manufacturerCode)){countSb.append("AND code like '%"+manufacturerCode+"%' \n");}countSb.append("AND  CODE IS NOT NULL \n");countSb.append("AND NAME IS NOT NULL) z");//分页sqlString pageSql = "SELECT * FROM \n" +"(SELECT z.*,ROWNUM ruw_num FROM (SELECT DISTINCT ORG_ID, CODE AS manufacturer_code,NAME as manufacturer_name FROM BUCP.FBS_V_ORG \n" +"WHERE unity  = '公司' \n";StringBuilder pageSb = new StringBuilder();pageSb.append(pageSql);if(StringUtils.isNotBlank(manufacturerName)){pageSb.append("AND name like '%"+manufacturerName+"%' \n");}if(StringUtils.isNotBlank(manufacturerCode)){pageSb.append("AND code like '%"+manufacturerCode+"%' \n");}pageSb.append("and  CODE IS NOT NULL \n");pageSb.append("AND NAME IS NOT NULL) z \n");pageSb.append("WHERE ROWNUM<= "+startNum+") \n");pageSb.append("WHERE ruw_num> "+endNum);try {//获取总数pstm = connection.prepareStatement(countSb.toString());rs = pstm.executeQuery();while (rs.next()) {totalNum = rs.getInt("total");}//oracle分页查询pstm = connection.prepareStatement(pageSb.toString());rs = pstm.executeQuery();while (rs.next()) {DiffVO diffVO = new DiffVO();diffVO.setManufacturerCode(rs.getString("manufacturer_code"));diffVO.setManufacturerName(rs.getString("manufacturer_name"));diffVO.setDataType(0);resultPage.add(diffVO);}} catch (SQLException e) {throw new SinomaException("sql执行异常,请核实!"+e.getMessage());}if(!CollectionUtils.isEmpty(resultPage)){//涉及到树结构数据递归下钻,初始全量treeCode来实现//oracle数据库查询的数据封装List<DubateOrgDTO> allDubateDto = new ArrayList<>();String allSql = "SELECT * FROM BUCP.FBS_V_ORG \n" +"WHERE unity  = '部门' AND  CODE IS NOT NULL AND NAME IS NOT NULL";try {pstm = connection.prepareStatement(allSql);rs = pstm.executeQuery();while (rs.next()) {DubateOrgDTO dto = new DubateOrgDTO();dto.setOrgId(rs.getInt("org_id"));dto.setCode(rs.getString("code"));dto.setName(rs.getString("name"));dto.setPname(rs.getString("pname"));dto.setPcode(rs.getString("pcode"));//初始全量treeCodeString code = dto.getCode();if(StringUtils.isNotBlank(code)){List<String> projectInstitutionCodes = new ArrayList<>();projectInstitutionCodes.add(code);//根据当前code递归获取全量父级code逗号分隔,递归方法在下方projectInstitutionCodes = getAllCode(projectInstitutionCodes,dto.getPcode(),connection,pstm,rs);if(!CollectionUtils.isEmpty(projectInstitutionCodes)){dto.setAllCode(String.join(",", projectInstitutionCodes));}}allDubateDto.add(dto);}} catch (SQLException e) {throw new SinomaException("sql执行异常,请核实!"+e.getMessage());}//主数据mysql数据库查询的数据封装(已包含全量treeCode)List<InstitutionVO> allMaindataDto = institutionMapper.getInstitutionPartList();//遍历resultPage初始化差异数量for (DiffVO diffVO : resultPage) {String dubateCode = diffVO.getManufacturerCode();if(StringUtils.isNotBlank(dubateCode)){//oracle分组统计数量Integer dubateCount = 0;for (DubateOrgDTO dubateOrgDTO : allDubateDto) {String allCode = dubateOrgDTO.getAllCode();if(StringUtils.isNotBlank(allCode)){List<String> codeList = Arrays.asList(allCode.split(","));if(codeList.contains(dubateCode)){dubateCount = dubateCount + 1;}}}diffVO.setDubateCount(dubateCount);//主数据mysql分组统计数量Integer maindataCount = 0;for (InstitutionVO institutionVO : allMaindataDto) {String institutionCode = institutionVO.getInstitutionCode();String allCode = institutionVO.getMainInstitutionAll();if(StringUtils.isNotBlank(allCode)){List<String> codeList = Arrays.asList(allCode.split(","));if(codeList.contains(dubateCode)&&!institutionCode.equals(dubateCode)){maindataCount = maindataCount + 1;}}}diffVO.setMaindataCount(maindataCount);}else{diffVO.setDubateCount(0);diffVO.setMaindataCount(0);}diffVO.setDiffCount(Math.abs(diffVO.getDubateCount()-diffVO.getMaindataCount()));}}} catch (SinomaException e) {throw new SinomaException("主数据与其他数据源的组织数据比对异常,请核实!"+e.getMessage());}finally {//释放数据库连接DBUtils.releaseResource(rs,pstm,connection);}}result.setTotal(totalNum);result.setResultPage(resultPage);return result;}

DBUtils 工具类

public class DBUtils {/*** 获取Connection对象** @return*/public static Connection getConnection(String drvier,String url,String usernamr,String password) {// 创建一个数据库连接Connection connection = null;try {Class.forName(drvier);connection = DriverManager.getConnection(url, usernamr, password);} catch (ClassNotFoundException e) {throw new RuntimeException("class not find !", e);} catch (SQLException e) {throw new RuntimeException("get connection error!", e);}return connection;}/**** @param rs 结果集对象* @param pstm 预编译语句对象* @param connection 数据库连接*/public static void releaseResource(ResultSet rs,PreparedStatement pstm,Connection connection) {if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (pstm != null) {try {pstm.close();} catch (SQLException e) {e.printStackTrace();}}if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}

getAllCode向上递归所有的treeCode(当前code的全量code)

private List<String> getAllCode(List<String> mainInstitutionCodes, String pcode,Connection connection,PreparedStatement pstm,ResultSet rs) {try {//根据pcode获取组织信息String allSql = "SELECT * FROM BUCP.FBS_V_ORG  \n" +"WHERE  CODE IS NOT NULL AND NAME IS NOT NULL\n" +"AND CODE = ?";pstm = connection.prepareStatement(allSql);pstm.setString(1,pcode);rs = pstm.executeQuery();while (rs.next()) {DubateOrgDTO dto = new DubateOrgDTO();dto.setOrgId(rs.getInt("org_id"));dto.setCode(rs.getString("code"));dto.setName(rs.getString("name"));dto.setShortname(rs.getString("shortname"));dto.setRank(rs.getString("rank"));dto.setStatus(rs.getString("status"));dto.setUnity(rs.getString("unity"));dto.setPname(rs.getString("pname"));dto.setPcode(rs.getString("pcode"));dto.setProjectcode(rs.getString("projectcode"));dto.setArea(rs.getString("area"));dto.setCountry(rs.getString("country"));dto.setAddress(rs.getString("address"));dto.setCity(rs.getString("city"));dto.setSocialcreditcode(rs.getString("socialcreditcode"));dto.setPostcode(rs.getString("postcode"));dto.setEnname(rs.getString("enname"));dto.setTel(rs.getString("tel"));if (StringUtils.isNotBlank(dto.getCode())&&StringUtils.isNotBlank(dto.getPcode())) {mainInstitutionCodes.add(dto.getCode());getAllCode(mainInstitutionCodes, dto.getPcode(),connection,pstm,rs);}}} catch (SQLException e) {throw new SinomaException("sql执行异常,请核实!"+e.getMessage());}return mainInstitutionCodes;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/141484.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

工业互联网:数字化革命的引擎

工业互联网&#xff0c;作为数字化革命的引擎&#xff0c;正以前所未有的速度和力度改变着我们的世界。这一概念不再局限于企业内部的信息技术应用&#xff0c;而是将互联网、大数据、人工智能等技术深度融入到制造业、能源、交通、农业等各个领域&#xff0c;实现了设备、系统…

【深度学习】ONNX模型多线程快速部署【基础】

【深度学习】ONNX模型CPU多线程快速部署【基础】 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】ONNX模型CPU多线程快速部署【基础】前言搭建打包环境python多线程并发简单教程基本教程ONNX模型多线程并发 打包成可执行文件总结 前…

rar格式转换zip格式,如何做?

平时大家压缩文件时对压缩包格式可能没有什么要求&#xff0c;但是&#xff0c;可能因为工作需要&#xff0c;我们要将压缩包格式进行转换&#xff0c;那么我们如何将rar格式转换为其他格式呢&#xff1f;方法如下&#xff1a; 工具&#xff1a;WinRAR 打开WinRAR&#xff0c…

友思特案例|友思特 Ensenso 3D相机:汽车工业自动化的革命性力量

01 内容摘要 在竞争激烈的汽车行业&#xff0c;自动化生产至关重要。友思特 Ensenso 3D相机为汽车制造商提供了可靠的工具和技术支持&#xff0c;助力多个关键环节。它在汽车座位泡棉切割中提高精确度&#xff0c;降低浪费&#xff0c;提高生产效率&#xff1b;在汽车压铸零部…

ad18学习笔记十二:如何把同属性的元器件全部高亮?

1、先选择需要修改的器件的其中一个。 2、右键find similar objects&#xff0c;然后在弹出的对话框中&#xff0c;将要修改的属性后的any改为same 3、像这样勾选的话&#xff0c;能把同属性的元器件选中&#xff0c;其他器件颜色不变 注意了&#xff0c;如果这个时候&#xff…

浅谈xss

XSS 简介 XSS,全称Cross Site Scripting,即跨站脚本攻击,是最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。需要强调的是,XSS不仅…

Win10专业版系统一键重装怎么操作?

Win10专业版系统一键重装怎么操作&#xff1f;与传统的系统重装相比&#xff0c;一键重装不仅省去了繁琐的安装步骤&#xff0c;这一简单操作使得系统维护和恢复变得更加便捷&#xff0c;让用户不再为系统问题而烦恼。下面小编给大家详细介绍关于一键重装Win10专业版系统的操作…

Tune-A-Video论文阅读

论文链接&#xff1a;Tune-A-Video: One-Shot Tuning of Image Diffusion Models for Text-to-Video Generation 文章目录 摘要引言相关工作文生图扩散模型文本到视频生成模型文本驱动的视频编辑从单个视频生成 方法前提DDPMsLDMs 网络膨胀微调和推理模型微调基于DDIM inversio…

ElasticSearch从入门到精通(二)

ElasticSearch 高级操作 bulk批量操作 批量操作-脚本 #批量操作 #1.删除5号 #新增8号 #更新2号 name为2号 POST _bulk {"delete":{"_index":"person1","_id":"5"}} {"create":{"_index":"person…

Android 10.0 系统开启和关闭黑白模式主题功能实现

1. 概述 在10.0的rom系统开发定制化中,在系统SystemUI的下拉状态栏中,产品开发功能需求要求添加黑白模式功能开关的功能,就是打开黑白模式,系统颜色就会变成黑白颜色, 关闭黑白模式开关系统就会变成彩色模式,所以就需要了解下系统是怎么设置黑白模式和彩色模式的,然后添…

docker下redis备份文件dump.rdb获取

1.查看镜像 docker ps -a 2.进入redis客户端 docker exec -it redis redis-cli 3.保存备份文件 save 4.查看文件存放位置 CONFIG GET dir 5.将docker中文件拷出 docker cp id或name:容器中文件的路径 目标目录地址

研究铜互连的规模能扩大到什么程度

随着领先的芯片制造商继续将finFET以及很快的纳米片晶体管缩小到越来越小的间距&#xff0c;使用铜及其衬垫和阻挡金属&#xff0c;较小的金属线将变得难以维持。接下来会发生什么以及何时发生&#xff0c;仍有待确定。 自从IBM在20世纪90年代向业界引入采用双镶嵌工艺的铜互连…

一文教你彻底理解什么是协程!

作为程序员&#xff0c;想必你多多少少听过协程这个词&#xff0c;这项技术近年来越来越多的出现在程序员的视野当中&#xff0c;尤其高性能高并发领域。当你的同学、同事提到协程时如果你的大脑一片空白&#xff0c;对其毫无概念。。。 那么这篇文章正是为你量身打造的。话不…

flink集群与资源@k8s源码分析-回顾

本章是分析系列最后一章,作为回顾,以运行架构图串联起所有分析场景 1 启动集群,部署集群(提交k8s),新建作业管理器组件 2 构建和启动flink master组件 3 提交作业,N/A

性能测试分析调优必备的java虚拟机知识

Java虚拟机 Java虚拟机&#xff08;Java Virtual Machine&#xff0c;简称JVM&#xff09;是一种用于执行Java字节码的虚拟计算机。它是Java平台的关键组成部分&#xff0c;负责将Java源代码编译为可在不同计算机体系结构上执行的字节码。 JVM起到了中间层的作用&#xff0c…

IP转地理位置:探讨技术与应用

IP地址是互联网上设备的唯一标识符&#xff0c;而将IP地址转换为地理位置信息是网络管理、安全监控和市场定位等领域中的一项重要任务。本文将深入探讨IP转地理位置的技术原理和各种应用场景。 IP地址与地理位置 IP地址&#xff08;Internet Protocol Address&#xff09;是一…

面试官:你了解axios的原理吗?有看过它的源码吗?

面试官&#xff1a;你了解axios的原理吗&#xff1f;有看过它的源码吗&#xff1f; 一、axios的基本使用 关于 axios 的基本使用&#xff0c;上篇文章已经有所涉及&#xff0c;这里再稍微回顾一下&#xff1a; 发送请求 import axios from axios;axios(config) // 直接传入…

一百八十六、大数据离线数仓完整流程——步骤五、在Hive的DWS层建动态分区表并动态加载数据

一、目的 经过6个月的奋斗&#xff0c;项目的离线数仓部分终于可以上线了&#xff0c;因此整理一下离线数仓的整个流程&#xff0c;既是大家提供一个案例经验&#xff0c;也是对自己近半年的工作进行一个总结。 二、数仓实施步骤 &#xff08;五&#xff09;步骤五、在Hive的…

《从菜鸟到大师之路 MySQL 篇》

《从菜鸟到大师之路 MySQL 篇》 数据库是什么 数据库管理系统&#xff0c;简称为DBMS&#xff08;Database Management System&#xff09;&#xff0c;是用来存储数据的管理系统。 DBMS 的重要性 无法多人共享数据 无法提供操作大量数据所需的格式 实现读取自动化需要编程…

docker安装使用xdebug

docker安装使用xdebug 1、需要先安装PHP xdebug扩展 1.1 到https://pecl.php.net/package/xdebug下载tgz文件&#xff0c;下载当前最新稳定版本的文件。然后把这个tgz文件放到php/extensions目录下&#xff0c;记得install.sh中要替换解压的文件名&#xff1a; installExtensio…