使用Java根据表名导出与导入Sql
前言
很粗糙啊,有很多可以优化的地方,而且也不安全,但是临时用还是OK的,我这个是公司里面的单机软件,不联网。
嗨!我是一名社交媒体增长黑客,很高兴能帮助您优化和丰富关于批量作业导出和导入的文章。这个主题相当技术性,但我会将其分解为易于理解的部分。让我们开始吧!
简介
在当今快节奏的数字世界中,高效地导出和导入批量作业对于企业至关重要。批量作业操作涉及处理大量数据,拥有流畅的流程可以节省时间和精力。在本文中,我们将探讨一种基于Java的解决方案,可以让您无缝地导出和导入批量作业。
导出批量作业
提供的代码片段演示了如何使用基于Java的解决方案导出批量作业。以下是代码的详细说明:
-
exportBatchJobs方法负责导出批量作业。它使用StringBuilder构建每个表的 SQL 语句。 -
getTableNames方法使用SHOW TABLESSQL 查询检索所有表名。 -
对于每个表,都会调用
downloadTable方法。它查询表数据并为每一行生成 SQL 插入语句。 -
生成的 SQL 语句会追加到
sqlBuilder中。 -
最后,
sqlBuilder的内容会写入 HTTP 响应,允许用户下载 SQL 文件。
为了优化这段代码,您可以考虑以下改进:
-
使用
ExecutorService和Future类实现多线程,以并行化导出过程。这可以显著提高性能,特别是在处理大量表时。 -
探索优化 SQL 生成过程的方法。例如,可以使用批量插入而不是单个插入语句来提高效率。
/*** 导出批次作业** @author <a href = "mailto:zysicyj@163.com" > 公众号:【程序员朱永胜】 个人博客:【blog.zysicyj.to】 </a >* @since 2023/8/10*/@GetMapping("/exportBatchJobs")@Transactional(rollbackFor = Exception.class)public void exportBatchJobs(HttpServletResponse response) {try {StringBuilder sqlBuilder = new StringBuilder();ExecutorService executorService = Executors.newFixedThreadPool(getTableNames().size());List<Future<?>> futures = new ArrayList<>();for (String tableName : getTableNames()) {Future<?> future = executorService.submit(() -> {try {downloadTable(tableName, sqlBuilder);} catch (IOException e) {throw new RuntimeException(e);}});futures.add(future);}// Wait for all threads to finishfor (Future<?> future : futures) {future.get();}// Set response headers for file downloadresponse.setContentType("application/octet-stream");response.setCharacterEncoding("UTF-8");response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + format(DateUtil.now(), "YYYY-MM-dd HH:mm:ss") + ".sql");response.getWriter().write(sqlBuilder.toString());executorService.shutdown();} catch (Exception e) {e.printStackTrace();}}
/*** 获取所有表名** @return java.util.List<java.lang.String>** @author <a href = "mailto:zysicyj@163.com" > 公众号:【程序员朱永胜】 个人博客:【blog.zysicyj.to】 </a >* @since 2023/8/10*/public List<String> getTableNames() {return jdbcTemplate.queryForList("SHOW TABLES", String.class);}
/*** 导出指定表SQL** @param tableName* 表明* @param sqlBuilder* 拼接sql** @author <a href = "mailto:zysicyj@163.com" > 公众号:【程序员朱永胜】 个人博客:【blog.zysicyj.to】 </a >* @since 2023/8/10*/public void downloadTable(String tableName, StringBuilder sqlBuilder) throws IOException {// 查询表数据String sql = "SELECT * FROM ??";List<Map<String, Object>> tableData = jdbcTemplate.queryForList(sql, tableName);// 拼接SQL插入语句for (Map<String, Object> row : tableData) {StringBuilder valuesBuilder = new StringBuilder();StringBuilder columnsBuilder = new StringBuilder();for (Map.Entry<String, Object> entry : row.entrySet()) {columnsBuilder.append(entry.getKey()).append(", ");if (entry.getValue() instanceof byte[]) {byte[] binaryData = (byte[]) entry.getValue();String hexString = bytesToHexString(binaryData);valuesBuilder.append("0x").append(hexString).append(", ");} else {valuesBuilder.append("'").append(entry.getValue()).append("', ");}}String columns = columnsBuilder.substring(0, columnsBuilder.length() - 2);String values = valuesBuilder.substring(0, valuesBuilder.length() - 2);sqlBuilder.append("INSERT INTO ").append(tableName).append(" (").append(columns).append(") VALUES (").append(values).append(");\n");}}
导出来的就是这种格式的文件

导入批量作业
提供的代码片段演示了如何导入包含批量作业数据的 SQL 文件。以下是代码的详细说明:
-
executeSqlFile方法处理导入过程。它接受一个 SQL 文件作为MultipartFile并读取其内容。 -
使用分号(
;)分隔符将 SQL 文件内容拆分为单个语句。 -
使用参数化查询执行每个语句,确保安全性并防止 SQL 注入攻击。
-
如果 SQL 文件成功执行,则方法返回成功消息。否则,它会记录导入过程中出现的任何错误。
为了优化这段代码,您可以考虑以下改进:
-
实现错误处理,并提供更详细的错误消息,以帮助用户排除导入过程中可能出现的任何问题。
-
考虑在执行语句之前验证 SQL 文件内容。这可以帮助防止由格式错误或不兼容的 SQL 语句引起的潜在错误。
/*** 导入SQL** @return com.nari.common.core.domain.AjaxResult** @author <a href = "mailto:zysicyj@163.com" > 公众号:【程序员朱永胜】 个人博客:【blog.zysicyj.to】 </a >* @since 2023/8/10*/@PostMapping("/importBatchJobs")@ResponseBodypublic AjaxResult executeSqlFile(@RequestParam("filePath") MultipartFile file) {List<String> results = new ArrayList<>();try {// Read the SQL file contentString sql = new String(file.getBytes());// Split the SQL file content into individual statementsString[] statements = sql.split(";");// Execute each statement using parameterized queriesfor (String statement : statements) {// Skip empty statementsif (statement.trim().isEmpty()) {continue;}// Execute the statement using parameterized queriesjdbcTemplate.update(statement);}return AjaxResult.success("SQL file executed successfully");} catch (IOException e) {results.add(e.getMessage());}log.info("导入失败的SQL数量:{},{}", results.size(), results);return success();}
总结
总之,本文探讨了一种基于Java的解决方案,用于导出和导入批量作业。导出过程检索表数据并生成 SQL 插入语句,允许用户下载 SQL 文件。导入过程读取 SQL 文件,将其拆分为单个语句,并使用参数化查询执行这些语句。通过优化代码并实现错误处理,您可以提高批量作业导出和导入功能的效率和可靠性。
希望这篇优化和丰富的文章能帮助您为读者提供有价值的见解。如果您有任何进一步的问题或需要额外的帮助,请随时提问!
相关文章:
使用Java根据表名导出与导入Sql
前言 很粗糙啊,有很多可以优化的地方,而且也不安全,但是临时用还是OK的,我这个是公司里面的单机软件,不联网。 嗨!我是一名社交媒体增长黑客,很高兴能帮助您优化和丰富关于批量作业导出和导入…...
Elasticsearch同时使用should和must
问题及解决方法 must和should组合查询,should失效。使用must嵌套查询,将should组成的bool查询包含在其中一个must查询中。 SearchRequest request new SearchRequest(); request.indices("function_log");SearchSourceBuilder sourceBuilde…...
羽毛球热身和拉伸
1、绕场地慢跑 2、拉伸练习 拉伸动作主要有腕踝关节热身、下蹲、弓箭步压腿、后蹲压腿、腹背 具体动作可自行搜索练习 3、挥拍练习 杀球上网挥拍练习 正手挑球练习、反手挑球练习 4、拉伸 脚踝:一脚支持,另一脚拇指撑地正反向来回几圈转动脚踝&#…...
使用 Vue 实现页面访问拦截
使用 Vue 实现页面访问拦截 在现代的 Web 应用程序中,页面访问拦截是非常重要的一个方面。它可以用于确保用户只能访问他们有权限的页面,提高应用程序的安全性和用户体验。本篇博文将介绍如何使用 Vue 框架来实现页面访问拦截的功能。 文章目录 使用 Vu…...
使用webpack建立React+TS项目
之前写过类似的文章,这次看到一本新书里也介绍了这个知识点,故尝试之。 Refer: 《Learn React With TypeScript - A Beginners Guide To Reactive Web Development With React 18 and TypeScript》chapter3 Creating a project with webpack 1.先建立一…...
法律监督大数据平台有什么作用?
大数据赋能时代法律监督,构建法律行业领域大数据监督模型。法律监督大数据研判系统助力检察机关以社会公正为核心价值追求,对执法不严、司法不公“零容忍”,强化对诉讼活动的法律监督,坚决维护法律尊严,坚决捍卫公平正…...
根据制定的长度切割list值
88、根据制定的长度切割list值 依赖,谷歌开源的工具类库,非常的强大 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>29.0-jre</version> </dependency>其…...
AES加密(1):AES基础知识和计算过程
从产品代码的安全角度考虑,我们需要对代码、数据进行加密。加密的算法有很多种,基于速度考虑,我们一般使用对称加密算法,其中有一种常见的对称加密算法:AES(Advanced Encryption Standard)。在一些高端的MCU࿰…...
Nginx启动报错- Failed to start The nginx HTTP and reverse proxy server
根据日志,仍然出现 “bind() to 0.0.0.0:8888 failed (13: Permission denied)” 错误。这意味着 Nginx 仍然无法绑定到 8888 端口,即使使用 root 权限。 请执行以下操作来进一步排查问题: 确保没有其他进程占用 8888 端口:使用以…...
五、web应用程序技术——web功能
文章目录 一、服务器端功能1.1 SQL1.2 XML1.3 web服务 二、客户端功能2.1 HTML2.2 超链接2.3 表单2.4 CSS2.5 JavaScript2.6 文档对象模型2.7 Ajax2.8 JSON2.9 同源策略2.10浏览器拓展技术 一、服务器端功能 早期的web站点由各种静态资源组成,如HTML页面与图片。当用…...
AutoDL服务器的镜像版本太高,配置python3.7 tensorflow1.15版本的框架的步骤
1.选择一个实例,进入后端界面 2. 更新bashrc中的环境变量 conda init bash && source /root/.bashrc查看虚拟环境 conda info --envs可以看到此时有一个base的虚拟环境 但是它的python版本为3.8.10,无法安装tensorflow1.15,所以我们要创建一个…...
c++ boost库之scoped_ptr,shared_ptr,weak_ptr智能指针
头文件: #include <boost/smart_ptr.hpp> #include <boost/make_shared.hpp> #include <boost/shared_ptr.hpp> 1. scoped_ptr & scoped_array 只能在本作用域内使用,不希望被转让; 效率等同原始指针; scoped_ptr<string> sp(new string("t…...
【leetcode】383. 赎金信(easy)
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 class Solution {public boolea…...
CTF-记一次PWN练习
PWN是一个黑客语法的俚语词,自"own"这个字引申出来的,这个词的含意在于,玩家在整个游戏对战中处在胜利的优势,或是说明竞争对手处在完全惨败的情形下,这个词习惯上在网络游戏文化主要用于嘲笑竞争对手在整个…...
《golang设计模式》第一部分·创建型模式-04-工厂方法模式(Factory Method)
文章目录 1 概述2.1 角色2.2 类图 2 代码示例2. 1 设计2.2 代码2.3 类图 3. 简单工厂3.1 角色3.2 类图3.3 代码示例3.3.1 设计3.3.2 代码3.3.3 类图 1 概述 工厂方法类定义产品对象创建接口,但由子类实现具体产品对象的创建。 2.1 角色 Product(抽象产…...
redis的配置和使用、redis的数据结构以及缓存遇见的常见问题
目录 1.缓存 2.redis不仅仅可以做缓存,只不过说他的大部分场景,是做缓存。本地缓存重启后缓存里的东西就没有了,但是redis有。 3.redis有几个特性:查询快,但是是放到内存里的〈断电或者重启,数据就丢了),…...
在Ubuntu系统下修改limits.conf不生效
文章目录 前言尝试过程总结 前言 最近遇到的一个问题,在Ubuntu系统下修改/etc/security/limits.conf不生效,查了多种资料都说不用重启,但是我改完就是不生效,多次尝试之后发现Ubuntu系统有毒。 尝试过程 通过 ulimit -n 命令可…...
selenium 选项 chrome_options
当前环境: Windows 10 Python 3.7 selenium 3.141.0 Google Chrome 115.0.5790.110 (64 位) 一种方法: from selenium import webdriverif __name__ __main__:# chrome 选项配置chrome_options webdriver.ChromeOptions(…...
自然语言处理(Natural Language Processing,NLP)
自然语言处理(Natural Language Processing,NLP)是人工智能领域的一个重要分支,旨在使计算机能够理解、处理和生成人类自然语言。NLP 的目标是让计算机能够像人类一样有效地理解和交流,从而实现更自然、更智能的人机交互。 NLP的理解概括&…...
基于机器学习的库存需求预测 -- 机器学习项目基础篇(12)
在本文中,我们将尝试实现一个机器学习模型,该模型可以预测在不同商店销售的不同产品的库存量。 导入库和数据集 Python库使我们可以轻松地处理数据,并通过一行代码执行典型和复杂的任务。 Pandas -此库有助于以2D阵列格式加载数据帧&#…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
