达梦数据库在终端/控制台交互查询SQL语句,查询结果导出excel

达梦数据库在终端/控制台交互查询SQL语句,查询结果导出excel

依赖

安装JDK,maven引入达梦包,maven打包主类改成查询工具类,即可放到linux平台运行

<dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.2.192</version>
</dependency><!--导出excel所需依赖-->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.3</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version>
</dependency>
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><mainClass>org.example.dmtest.DMDatabaseQuery</mainClass></configuration></plugin></plugins>
</build>

操作方法

  • 直接运行,或者打包后java -jar运行控制台

  • 输入 SQL 查询语句(分号结束)

  • 输入 'export ’ 加查询语句,将结果导出为excel;

  • 查询语句默认分页前10条,防止数据量过大;

  • 支持多行换行输入;

  • 支持连续交互,输入 ‘exit;’ 退出;

查询内容:

在这里插入图片描述

导出excel:export + 查询sql;

在这里插入图片描述

工具类

package org.example.dmtest;import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;public class DMDatabaseQuery {private static final String URL = "jdbc:dm://ip:端口?schema=模式名";private static final String USER = "用户名";private static final String PASSWORD = "密码";public static void main(String[] args) {try {Class.forName("dm.jdbc.driver.DmDriver"); // 加载驱动try (Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);Scanner scanner = new Scanner(System.in)) {Statement statement = connection.createStatement();System.out.println("输入 SQL 查询语句(分号结束),输入 'exit;' 退出;输入 'export ' 加查询语句,将结果导出为excel;默认分页前10条;");while (true) {StringBuilder sqlBuilder = new StringBuilder();String line;// 读取多行输入boolean firstLine = true; // 用于标记是否为第一行输入while (true) {if (firstLine) {System.out.print("SQL: ");firstLine = false; // 设置为 false,以后不再显示提示} else {System.out.print("    "); // 后续行缩进显示}line = scanner.nextLine().trim(); // 去掉行首行尾空格// 如果输入为空,继续下一行if (line.isEmpty()) {continue;}sqlBuilder.append(line).append(" "); // 添加到 SQL 字符串// 如果行以分号结尾,则停止读取if (line.endsWith(";")) {break;}}String sql = sqlBuilder.toString().trim();// 检查是否退出if ("exit;".equalsIgnoreCase(sql)) {break;}// 去掉最后的分号if (sql.endsWith(";")) {sql = sql.substring(0, sql.length() - 1).trim();}// 检查是否包含 export,去掉 exportboolean isExport = false;if (sql.trim().toLowerCase().startsWith("export ")) {isExport = true;sql = sql.substring("export ".length()).trim(); // 去掉 export}// 检查并添加 LIMIT 10if (sql.trim().toLowerCase().startsWith("select") && !sql.toLowerCase().contains("limit")) {sql += " LIMIT 10";}System.out.println("执行SQL: " + sql);try {ResultSet resultSet = statement.executeQuery(sql);int columnCount = resultSet.getMetaData().getColumnCount();// 如果需要导出,调用导出方法if (isExport) {exportToExcel(resultSet, columnCount, sql);} else {// 打印表头for (int i = 1; i <= columnCount; i++) {String columnName = resultSet.getMetaData().getColumnName(i);System.out.printf("%-15s", columnName); // 设置列宽}System.out.println(); // 换行// 打印每一行数据while (resultSet.next()) {for (int i = 1; i <= columnCount; i++) {String value = resultSet.getString(i);System.out.printf("%-15s", value); // 设置列宽}System.out.println(); // 换行}}} catch (Exception e) {System.out.println("执行查询时出错: " + e.getMessage());}}} catch (Exception e) {System.out.println("连接数据库时出错: " + e.getMessage());}} catch (ClassNotFoundException e) {System.out.println("找不到数据库驱动: " + e.getMessage());}}private static void exportToExcel(ResultSet resultSet, int columnCount, String sql) {Workbook workbook = new XSSFWorkbook();Sheet sheet = workbook.createSheet("Query Result");try {// 创建表头Row headerRow = sheet.createRow(0);for (int i = 1; i <= columnCount; i++) {String columnName = resultSet.getMetaData().getColumnName(i);Cell cell = headerRow.createCell(i - 1);cell.setCellValue(columnName);}// 写入数据行int rowIndex = 1;while (resultSet.next()) {Row row = sheet.createRow(rowIndex++);for (int i = 1; i <= columnCount; i++) {String value = resultSet.getString(i);Cell cell = row.createCell(i - 1);cell.setCellValue(value);}}// 处理 SQL 查询生成有效的文件名String fileName = generateFileName(sql) + ".xlsx"; // 输出文件名try (FileOutputStream fileOut = new FileOutputStream(fileName)) {workbook.write(fileOut);}System.out.println("数据已成功导出到文件: " + fileName);} catch (Exception e) {System.out.println("导出到 Excel 时出错: " + e.getMessage());} finally {try {workbook.close();} catch (Exception e) {System.out.println("关闭工作簿时出错: " + e.getMessage());}}}// 生成有效的文件名private static String generateFileName(String sql) {// 去掉前导的 "export ",并将所有特殊字符替换为下划线String cleanName = sql.replaceAll("^export\\s+", "").replaceAll("[\\\\/:*?\"<>|]", "_");// 限制文件名长度,避免超出操作系统限制(一般为255字符)return cleanName.length() > 50 ? cleanName.substring(0, 50) : cleanName;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】设备树

设备树简介 我们前面介绍过平台设备驱动&#xff0c;知道硬件资源信息可以放在设备中&#xff0c;然后在驱动的probe函数中从设备中获取资源信息。但是&#xff0c;Linux3.x以后的版本引入了设备树&#xff0c;设备树用于描述一个硬件平台的硬件资源&#xff0c;一般描述那些不…

node和npm版本冲突

问题描述&#xff1a; 解决办法&#xff1a; 一、 查看自己当前的node和npm版本 node -v npm -v 二、 登录node官网地址 node官网地址 https://nodejs.org/zh-cn/about/previous-releases 查看与自己node版本兼容的是哪一版本的npm,相对应进行更新即可。 三 升级node 下载最…

笑死人不偿命的联想:大象是什么?

element&#xff08;元素&#xff09;一词&#xff0c;起源不明。但是它长得很像elephant&#xff08;大象&#xff09;一词&#xff0c;其同通部分为ele-这一结构&#xff0c;因此我们很容易将两个单词进行拆分出来&#xff1a; element n.元素 // ele ment名缀elephant n.大…

书生-第四期闯关:完成SSH连接与端口映射并运行hello_world.py

端口映射完成后&#xff0c;访问127.0.0.1&#xff1a;7860成功展示如下界面&#xff1a; 书生浦语大模型实战营 项目地址&#xff1a;https://github.com/InternLM/Tutorial/

DBT踩坑第三弹

1. dbt在获取元数据信息的时候&#xff0c;底层使用pyHive的时候database信息没有传进去&#xff0c;pyHive默认又是会设置databasedefault&#xff0c;如果没有default库权限的&#xff0c;这个时候就会抛出Access异常。所以此时最好修改下 dbt-spark 的源码&#xff0c;把dat…

Codeforces Round 966 (Div. 3)

D. Right Left Wrong 题意 思路 我们可以先预处理前缀和&#xff0c;然后贪心每次找最左边的L和最右边的R&#xff0c;计算区间和&#xff0c;然后缩小区间重复操作即可 时间复杂度 O(N) void solve() {int n;cin >> n;vector<int> arr(n 1);vector<int>…

Qt 实战(10)模型视图 | 10.5、代理

文章目录 一、代理1、简介2、自定义代理 前言&#xff1a; 在Qt的模型/视图&#xff08;Model/View&#xff09;框架中&#xff0c;代理&#xff08;Delegate&#xff09;是一个非常重要的概念。它充当了模型和视图之间的桥梁&#xff0c;负责数据的显示和编辑。代理可以自定义…

NSSCTF-WEB-nizhuansiwei

前言 就直接上题目吧 这题有些意思 正文 <?php $text $_GET["text"]; $file $_GET["file"]; $password $_GET["password"];//定义三个变量 if(isset($text)&&(file_get_contents($text,r)"welcome to the zjctf"))…

无迹卡尔曼滤波器(UKF)

正如我们在前一章中所看到的&#xff0c;当状态转移模型f (x)和观测模型h (x)接近于线性时&#xff0c;EKF的性能是令人满意的。然而&#xff0c;当f (x)或h (x)模型是高度非线性的时&#xff0c;线性化误差会导致与状态的真实值显著不同的估计&#xff0c;以及不能捕获状态中的…

金蝶云星空与管易云的数据集成实战案例

金蝶云星空与管易云的数据集成案例分享 在企业信息化系统中&#xff0c;实现不同平台之间的数据无缝对接是提升业务效率的关键。本文将聚焦于一个具体的系统对接集成案例&#xff1a;如何将金蝶云星空中的调拨申请单数据集成到管易云的采购订单新增模块&#xff0c;特别是针对…

成本累计曲线:项目预算的秘密武器

在项目管理的过程中&#xff0c;成本控制是影响项目成败的关键因素之一&#xff0c;而其中“成本累计曲线”就像是一位财务导航员&#xff0c;为项目的成本控制和进度监控提供了极大的帮助。那么&#xff0c;什么是成本累计曲线&#xff1f;它包含哪些步骤&#xff1f;如何应用…

idea连接数据库出现错误的解决方式

在使用idea连接数据库时&#xff0c;出现错误&#xff1a; The server has terminated the handshake. The protocol list option (enabledTLSProtocols) is set, this option might cause connection issues with some versions of MySQL. Consider removing the protocol li…

C++朝花夕拾

目录 目录 函数分文件编写 野指针 const与指针 const修饰指针——常量指针 const修饰常量——指针常量 const既修饰指针,又修饰常量 const阻止函数修改 delete和delete[]的区别 内存四区&#xff08;面试会问&#xff1f;&#xff09; 程序运行前 代码区 全局区 程…

WPF中如何解决DataGrid的Header没有多余的一行

将最后一行设置DataGridTemplateColumn Width"*" 使其自适应

网站制作公司哪家比较靠谱?分享5家2024年口碑好的网站制作公司

想要分辨一家网站制作公司靠不靠谱并不简单&#xff0c;可能它流程透明&#xff0c;设计优秀。但这就一定是适合自己的吗&#xff1f;所以口碑这东西很重要。适合自己也很重要&#xff0c;要多方面去了解。 以下是五家在2024年口碑不错的网站制作公司&#xff0c;分享一下设计…

51单片机STC8G串口Uart配置

测试环境 单片机型号&#xff1a;STC8G1K08-38I-TSSOP20&#xff0c;其他型号请自行测试&#xff1b; IDE&#xff1a;KEIL C51&#xff1b; 寄存器配置及主要代码 STC8G系列单片机具有4个全双工异步串行通信接口&#xff1b;本文以串口1为例&#xff0c;串口1有4种工作方式…

像素、分辨率、PPI(像素密度)、帧率的概念

文章目录 前言一、像素1、定义2、像素点也不是越多越好 二、分辨率1、定义 三、PPI(像素密度)1、定义2、计算公式3、视网膜屏幕 四、帧率1、帧 (Frame)2、帧数 (Frames)3、帧率 (Frame Rate)4、FPS (Frames Per Second)5、赫兹 五、其他1、英寸2、为何显示器尺寸以英寸命名 总结…

Linux初阶——信号

一、预备 1、信号的处理方式 1.1. 默认动作 当收到一个信号时&#xff0c;就执行这个信号的默认动作。 1.2. 忽略 当收到一个信号时&#xff0c;就忽略执行这个信号的默认动作。 1.3. 自定义动作 当收到一个信号时&#xff0c;就执行信号的自定义动作。 2、硬件中断 你…

跨设备使用的便签软件哪款好?

在快节奏的现代生活中&#xff0c;便签软件已成为我们不可或缺的数字助手&#xff0c;它们帮助我们记录灵感、安排日程、设置提醒&#xff0c;极大地提升了我们的工作与生活效率。然而&#xff0c;面对市场上琳琅满目的便签应用&#xff0c;选择一款既实用又适合手机使用的便签…

【万兴科技-注册_登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…