达梦数据库在终端/控制台交互查询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;一般描述那些不…

ai智能语音电销机器人可以做哪些事情?

AI智能语音电销机器人是结合人工智能技术进行自动化电话销售和客户互动的工具&#xff0c;能够完成一系列任务&#xff0c;有助于提升销售效果、优化客户体验和提高工作效率。以下是AI智能语音电销机器人可以做的一些主要事情&#xff1a; 1. 自动拨号 AI语音电销机器人可以自…

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;负责数据的显示和编辑。代理可以自定义…

vscode每次提交代码都需要输入账号密码

背景 vscode每次提交代码都需要输入一次账号密码 解决方法 1. git设置账号密码邮箱&#xff0c;将下方命令输入到终端 //设置用户 git config --global user.name “xxx” //设置邮箱 git config --global user.email “xxxxxx.com” //设置密码 git config --global use…

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"))…

VB中如何创建和使用自定义控件

在Visual Basic&#xff08;VB&#xff09;中&#xff0c;创建和使用自定义控件是一个高级功能&#xff0c;它允许开发者根据特定需求创建具有独特行为和外观的控件。以下是在VB中创建和使用自定义控件的一般步骤&#xff1a; 一、创建自定义控件 打开VB开发环境&#xff1a; …

无迹卡尔曼滤波器(UKF)

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

JS实现图片放大镜效果

代码: <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>…

java后端把数据转换为树,map递归生成json树,返回给前端(后台转换)

java后端把数据转换为树,map递归生成json树,返回给前端(后台转换) 2023-12-10 java编程 跟版网 207 首先&#xff0c;需要明确一下这个过程的流程和目的&#xff1a;将后端获得的数据转换为树形结构&#xff0c;再通过递归生成 JSON 树&#xff0c;并返回给前端。下面我们将详…

nodejs项目从头创建

npm是包管理工具命令 参数init表示进行Node应用项目的初始化操作。 # -y 表示项目使用默认配置参数 npm init -y 装包 npm install electron --save-dev启动开发服务器 npm start 启动应用 运行在package.json中定义的脚本 npm run serve构建项目&#xff0c;通常用于生产…

CountDownLatch与CyclicBarrier的比较应用

CountDownLatch与CyclicBarrier的比较&应用 CountDownLatch 说明 一个线程等待其他线程执行完之后再执行&#xff0c;相当于加强版的join&#xff0c;在初始化CountDownLatch是需要设定计数器的数值&#xff08;计数器数据不一定跟线程数相同&#xff0c;但是一定计数器…

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

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

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

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

Python入门——iter迭代器—__iter__()方法__next__()方法

iter迭代器 在 Python 中&#xff0c;迭代器&#xff08;Iterator&#xff09;是一个可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问&#xff0c;直到所有的元素被访问完毕后结束。迭代器只能往前走&#xff0c;不能回退。 迭代器的核心概念 迭代器协议: 任…

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…