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

报表系统-连接数据库操作

本专栏用于解析自己开源的项目代码,作为复盘和学习使用。欢迎大家一起交流
本样例说明源码开源在:
ruoyi-reoprt gitee仓库
ruoyi-report github仓库
欢迎大家到到项目中多给点star支持,对项目有建议或者有想要了解的欢迎一起讨论

连接数据库这一模块整体参考的是AJ-report的模块:去掉了目前不支持的数据库格式,仅保留了mysql和sqlserver

https://gitee.com/anji-plus/report

1. 存储数据库连接

1.1 数据库连接表单设计

create table cwu_data_source
(source_code   varchar(100)  null comment '数据源编码',source_name   varchar(100)  null comment '数据源名称',source_desc   varchar(255)  null comment '数据源描述',source_type   varchar(50)   null comment '数据源类型 DIC_NAME=SOURCE_TYPE; mysql,orace,sqlserver,elasticsearch,接口,javaBean,数据源类型字典中item-extend动态生成表单',source_config varchar(2048) null comment '数据源连接配置json:关系库{ jdbcUrl:'''', username:'''', password:'''' } ES{ hostList:''ip1:9300,ip2:9300,ip3:9300'', clusterName:''elasticsearch_cluster'' }  接口{ apiUrl:''http://ip:port/url'', method:'''' } javaBean{ beanNamw:''xxx'' }',enable_flag   int default 1 null comment '0--已禁用 1--已启用  DIC_NAME=ENABLE_FLAG',id            int auto_incrementprimary key,create_time   bigint        null comment '创建时间',update_time   bigint        null comment '更新时间',update_user   bigint        null comment '更新者id',create_user   bigint        null comment '创建者id',create_org    bigint        null comment '创建的组织id',update_org    bigint        null comment '更新的组织id',is_delete     int default 0 null comment '1删除0有效',version       int           null,constraint unique_source_codeunique (source_code)
)comment '数据源管理' charset = utf8row_format = DYNAMIC;

1.2 测试连接配置是否能连接成功

在写入存储阶段先进行一次测试连接,给用户及时反馈配置是否正确。

使用Hikari进行数据库连接,获取到一个连接,判断是否能正常获取到

// 传入连接所需的参数
public class DataSourceDto extends BaseClass implements Serializable {/** 数据源编码 */private String sourceCode;/** 数据源名称 */private String sourceName;/** 数据源描述 */private String sourceDesc;/** 数据源类型 DIC_NAME=SOURCE_TYPE; mysql,orace,sqlserver,elasticsearch,接口,javaBean,数据源类型字典中item-extend动态生成表单 */private String sourceType;/** 数据源连接配置json:关系库{ jdbcUrl:'', username:'', password:'','driverName':''}ES-sql{ apiUrl:'http://127.0.0.1:9092/_xpack/sql?format=json','method':'POST','body':'{"query":"select 1"}' }  接口{ apiUrl:'http://ip:port/url', method:'' } javaBean{ beanNamw:'xxx' } */private String sourceConfig;/** 0--已禁用 1--已启用  DIC_NAME=ENABLE_FLAG */private Integer enableFlag;/** 0--未删除 1--已删除 DIC_NAME=DELETE_FLAG */private Integer deleteFlag;/**************************************************************//**关系型数据库jdbcUrl */private String jdbcUrl;/** 关系型数据库用户名 */private String username;/** 关系型数据库密码 */private String password;/** 关系型数据库驱动类 */private String driverName;/** 关系型数据库sql */private String sql;/** http requestUrl */private String apiUrl;/** http method */private String method;/** http header */private String header;/** http 请求体 */private String body;/** 动态查询sql或者接口中的请求体 */private String dynSentence;/** 传入的自定义参数,解决url中存在的动态参数*/private Map<String, Object> contextData;}public HikariPool getJdbcConnectionPool(DataSourceDto dataSource) {if (map.containsKey(dataSource.getId())) {return map.get(dataSource.getId());} else {try {synchronized (lock) {if (!map.containsKey(dataSource.getId())) {HikariPool pool = hikariPoolProperties.dataSource(dataSource.getJdbcUrl(),dataSource.getUsername(), dataSource.getPassword(), dataSource.getDriverName());map.put(dataSource.getId(), pool);log.info("创建连接池成功:{}", dataSource.getJdbcUrl());}}return map.get(dataSource.getId());} finally {}}}

2. 执行查询语句

目前能执行的数据库都是关系型数据库,所以直接执行到对应的方法中,先从连接池中根据数据库id取出对应的连接,如果没有的话新建一个。然后执行对应的sql语句.

查询结果用

 List<Map<String,Object>>

的结构返回,list中的一个元素表示一行的值,map中的key,value为数据库中对应的字段和值

 public List<Map<String,Object>> executeRelationalDb(DataSourceDto dto) {analysisRelationalDbConfig(dto);Connection pooledConnection = null;try {pooledConnection = jdbcService.getPooledConnection(dto);PreparedStatement statement = pooledConnection.prepareStatement(dto.getDynSentence());ResultSet rs = statement.executeQuery();int columnCount = rs.getMetaData().getColumnCount();List<String> columns = new ArrayList<>();for (int i = 1; i <= columnCount; i++) {String columnName = rs.getMetaData().getColumnLabel(i);columns.add(columnName);}List<Map<String,Object>> list = new ArrayList<>();while (rs.next()) {Map<String,Object> jo = new HashMap<>();columns.forEach(t -> {try {Object value = rs.getObject(t);//数据类型转换Object result = dealResult(value);jo.put(t, result);} catch (SQLException throwable) {log.error("error",throwable);throw new GlobalException(ResponseCode.EXECUTE_SQL_ERROR, throwable.getMessage());}});list.add(jo);}return list;} catch (Exception throwable) {log.error("error",throwable);throw new GlobalException(ResponseCode.EXECUTE_SQL_ERROR, throwable.getMessage());} finally {try {if (pooledConnection != null) {pooledConnection.close();}} catch (SQLException throwable) {log.error("error",throwable);throw new GlobalException(ResponseCode.DATA_SOURCE_CONNECTION_FAILED, throwable.getMessage());}}}

3. 获取数据库中的表和字段结构

对于mysql和sqlserver来说,传入表名字,获取表中的字段结构的sql语句存在不同,所以需要分别处理,执行拿到的数据结构统一格式返回

// 传入表名和数据库id,返回对应的表字段数据,包括字段名、类型、备注
public List<Map> getTableFile(String tableName,Integer dataSourceId) {DataSource dataSource = dataSourceService.getById(dataSourceId);List<Map<String,Object>> list = dataSourceService.execute(getSqlByType(dataSource.getSourceType(),tableName),dataSourceId);List<Map> mapList = new ArrayList<>();for (Map<String,Object> map : list) {Map<String,Object> map1 = new HashMap<>();map1.put("field",map.get("Field"));map1.put("type",map.get("Type"));if(map.get("Comment") != null && !map.get("Comment").equals("")){map1.put("comment",map.get("Comment"));}else {map1.put("comment",map.get("Field"));}mapList.add(map1);}return mapList;}
// 根据不同的类型返回不同的sql执行语句
private String getSqlByType(String type,String tableName){switch (type) {case JdbcConstants.MYSQL:return "show full fields from " + tableName; case JdbcConstants.SQL_SERVER:return "SELECT \n" +"    c.name AS Field,\n" +"    ty.name AS Type,\n" +"    c.is_nullable,\n" +"    ep.value AS Comment\n" +"FROM \n" +"    sys.columns c\n" +"    INNER JOIN sys.types ty ON c.user_type_id = ty.user_type_id\n" +"    INNER JOIN sys.tables t ON c.object_id = t.object_id\n" +"    LEFT JOIN sys.extended_properties ep ON c.object_id = ep.major_id \n" +"                                        AND c.column_id = ep.minor_id \n" +"                                        AND ep.name = 'MS_Description'\n" +"                                        AND ep.class = 1\n" +"WHERE \n" +"    t.name = '" + tableName + "'\n" +"    AND ty.is_user_defined = 0; ";default:throw new RuntimeException("不支持该类型");}}

4. 对应系统功能展示

在这里插入图片描述

在这里插入图片描述

相关文章:

报表系统-连接数据库操作

本专栏用于解析自己开源的项目代码&#xff0c;作为复盘和学习使用。欢迎大家一起交流 本样例说明源码开源在&#xff1a; ruoyi-reoprt gitee仓库 ruoyi-report github仓库 欢迎大家到到项目中多给点star支持&#xff0c;对项目有建议或者有想要了解的欢迎一起讨论 连接数据库…...

[计算机网络] 常见端口号

前言 ​ 常见的端口号是指互联网协议&#xff08;如TCP/IP&#xff09;中预留给特定服务使用的数字范围。它们主要用于标识网络应用程序和服务&#xff0c;并帮助数据包在网络中找到正确的接收方。 按协议类型划分 TCP协议端口&#xff1a; 21&#xff1a;FTP文件传输协议2…...

Linux系统块存储子系统分析记录

1 Linux存储栈 通过网址Linux Storage Stack Diagram - Thomas-Krenn-Wiki-en&#xff0c;可以获取多个linux内核版本下的存储栈概略图&#xff0c;下面是kernel-4.0的存储栈概略图&#xff1a; 2 存储接口、传输速度 和 协议 2.1 硬盘 《深入浅出SSD&#xff1a;固态存储核心…...

大数据——本地威胁检测的全球方法

大数据似乎是众多专业人士关注的话题&#xff0c;从在自然灾害发生时帮助挽救生命&#xff0c;到帮助营销团队设计更有针对性的策略以接触新客户。 对于安全工程师来说&#xff0c;大数据分析被证明是抵御不断演变的网络入侵的有效防御手段&#xff0c;这得益于基于大量不同网…...

使用postman接口测试

一 、postman断言 1、什么是断言 postman 断言借助JavaScript -js 语言编写代码&#xff0c;自动判断预期结果与实际结果是否一致。 断言代码写在 Tests 的标签中。(新版本在Scripts标签中) 2、断言工作原理 3、常用断言 断言响应状态码 // 断言响应状态码 是否为 200 pm.…...

Ubuntu24.04双系统安装(Linux/windows共存一文打通)

他向远方望去&#xff0c;无法看到高山背后的矮山&#xff0c;只能看到一座座更高的山峰。 目录 ​编辑 一.前言 二.虚拟机和双系统比较 三.Windows/Linux双系统安装 1.Rufus-制作U盘启动盘系统工具安装 2.Ubuntu24.04下载 3.Ubuntu-u盘启动盘制作 4.压缩磁盘留足安装空…...

C++ - deque

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【C】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 &#x1f4a1;双端队列简介1. 基本特性2. 与其他容器的比较与 vector与 list 3. 中控数组的设计4. 优缺点优点缺点 5. 应用场景6. 结论 &#x1f4a1;双端队列简…...

国产!瑞芯微米尔RK357核心板革新AIoT设备,8核6T高算力

随着科技的快速发展&#xff0c;AIoT智能终端对嵌入式模块的末端计算能力、数据处理能力等要求日益提高。近日&#xff0c;米尔电子发布了一款基于瑞芯微RK3576核心板和开发板。核心板提供4GB/8GB LPDDR4X、32GB/64GB eMMC等多个型号供选择。瑞芯微RK3576核心优势主要包括高性能…...

中国人寿财险青岛市分公司践行绿色金融,助力可持续发展

中国人寿财险青岛市分公司积极响应国家绿色发展战略&#xff0c;大力推进绿色金融实践。在保险产品创新方面&#xff0c;推出一系列绿色保险产品。如新能源汽车保险&#xff0c;为新能源汽车产业发展提供风险保障&#xff0c;促进交通领域的节能减排。环境污染责任保险则助力企…...

ajax 读取文件

DOMException: Failed to read the responseXML property from XMLHttpRequest: The value is only accessible if the objects responseType is or document (was blob). at XMLHttpRequest.r ( $.ajax({ url: 未来之窗_服务, method: GET, …...

火语言RPA流程组件介绍--开始监听网络请求

&#x1f6a9;【组件功能】&#xff1a;开始监听内置浏览器网络请求&#xff08;提示&#xff1a;本组件仅适用于火语言内置浏览器&#xff09; 配置预览 配置说明 匹配网址 可以添加一个或者多个匹配规则用于筛选需要保存的网络请求. 输入输出 输入类型 万能对象类型(Sy…...

CSS综合案例——新闻详情

一、知识点 1、文字颜色 属性名&#xff1a;color 属性值&#xff1a; 颜色表示方式属性值说明使用场景颜色关键字颜色英文单词red,green,blue学习测试rgb表示法rg(r,g,b)r,g,b表示红绿蓝三原色&#xff0c;取值0-255了解rgba表示法rgba(r,g,b,a)a表示透明度&#xff0c;取…...

【【自动驾驶】车辆运动学模型】

【自动驾驶】车辆运动学模型 1. 引言2. 以车辆重心为中心的单车模型2.1 模型介绍2.2 滑移角 β \beta β 的推导2.2 航向角 ψ \psi ψ推导过程&#xff1a;2.3 滑移角 β \beta β2.3 Python代码实现2.4 C代码实现 3. 前轮驱动的单车模型3.1 模型介绍3.3 Python代码实现3.4 …...

叉尖避障新科技:因泰立科技ILS-T52三维深度成像激光雷达

ILS-T52三维深度成像激光雷达是一款高性能的纯固态式激光雷达&#xff0c;采用激光时间飞行法&#xff0c;提供出色的三维图像成像和深度感知功能。特别适用于无人叉车领域&#xff0c;为叉尖避障提供卓越的三维成像和深度感知功能。它的高精度、自适应自动曝光、小尺寸、低功耗…...

精华帖分享 | 低估值还能涨多久?

本文来源于量化小论坛策略分享会板块精华帖&#xff0c;作者为亮子&#xff0c;发布于2024年3月19日。 这两年&#xff0c;A股给我们的感觉就是成长股坍塌&#xff0c;高股息低估值的股票扛起大旗。表现出来就是中国神华、中海油这样的垄断型央国企大涨&#xff0c;包括移动联通…...

如何制作一个自己的网站?

在今天的互联网时代&#xff0c;网站展示已经是一个很基础的营销工具。不管是企业、还是个人&#xff0c;如何制作一个自己的网站&#xff1f;本文将会提供一个全面的基础制作网页教程&#xff0c;教你如何从零开始制作网页。 网页制作的基础知识&#xff1a;HTML、CSS和JavaS…...

torch报错

The Kernel crashed while executing code in the current cell or a previous cell. Please review the code in the cell(s) to identify a possible cause of the failure. Click here for more info. View Jupyter log for further details. 从日志中可以看出&#xff0c;内…...

深入探索卷积神经网络(CNN):图像分类的利器

深入探索卷积神经网络&#xff08;CNN&#xff09;&#xff1a;图像分类的利器 前言CNN的崛起&#xff1a;为何我们需要它&#xff1f;图像卷积&#xff1a;CNN的基石轮廓过滤器&#xff1a;捕捉边缘特征 图像池化&#xff1a;降低维度的利器CNN的组成&#xff1a;卷积层、池化…...

网站建设中需要注意哪些安全问题?----雷池社区版

服务器与应用安全指南 1. 服务器安全 1.1 操作系统安全 及时更新补丁&#xff1a;确保操作系统始终安装最新补丁&#xff0c;以防范系统漏洞。例如&#xff0c;Windows Server 定期推送安全更新&#xff0c;修复如远程代码执行等潜在威胁。优化系统服务配置&#xff1a;关闭不…...

光控资本:养老金融建设提速 高速铜缆市场空间广阔

养老金融制作提速 金融监管总局办公厅近来印发的《关于大力展开商业保险年金有关事项的奉告》&#xff08;下称《奉告》&#xff09;提出&#xff0c;进一步扩大商业养老金业务试点&#xff1b;开发习惯个人养老金准则的新产品和专属产品&#xff1b;保险公司要坚持长期出资、…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...