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

数据备份文件生成--根据表名生成对应的sql语句文件

最近客户有个需求,希望在后台增加手动备份功能,将数据导出下载保存。

当然,此方法不适用于海量数据的备份,这只适用于少量数据的sql备份。

这是我生成的sql文件,以及sql文件里的insert语句,已亲测,可以直接执行:

项目是SSM框架,接下来就展示我的实现代码:

首先是接受字段的实体类:

@Data
public class ColumnsDto {/*** 表结构的主要字段**/private String column_name;//该字段则是表字段的数据类型  暂时不需要private String data_type;}

然后是用的到两个主要的sql:

1.此sql用于查询表的有效字段信息(table_schema:当前的数据库名

  <select id="queryColumnsByTableName" resultType="com.hle.monitor.entity.vo.ColumnsDto">SELECTcolumn_name,data_typeFROMinformation_schema.COLUMNSWHEREtable_name = #{tableName}AND table_schema = 'supervision_data'ORDER BY ordinal_position</select>

2.再用sql查询表的所有数据:(注意:此处表名需要要用$而不是#号)

  <select id="findBackupAll"  resultType="java.util.Map">select * from ${tableName}</select>

此处我省略了相应的service和mapper文件内容,直接展示最重要的controller代码:


import com.hle.monitor.entity.Results;
import com.hle.monitor.entity.vo.ColumnsDto;
import com.hle.monitor.service.UserService;
import com.hle.monitor.util.DateUtils;
import com.hle.monitor.util.MinIoUtil;
import com.hle.monitor.util.ParameterUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.http.entity.ContentType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.Resource;
import java.io.*;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;/*** @author*/
@CrossOrigin(origins = "*")
@RestController()
@RequestMapping("/backup")
@Api(tags = "备份相关接口类")
@Scope("prototype")
public class BackupController {@Autowiredprivate UserService userService;@ResourceMinIoUtil minIoUtil;//本地文件夹路径private static String backupFilePath = "./sql/";@ApiOperation(value = "根据表名备份信息")@GetMapping("/{tableName}")public Results backupTable(@PathVariable("tableName") String tableName) {//表有效字段信息List<ColumnsDto> columnsDtoList = userService.queryColumnsByTableName(tableName);if(columnsDtoList.isEmpty()) return new Results(500, "该表无有效字段信息!");//文件名--先在本地创建写入后再进行删除String fileName =  System.currentTimeMillis() + "-" + tableName + ".sql";try {//获取所有备份数据List<Map<String, Object>> records = userService.findBackupAll(tableName);String path = backupFilePath + fileName;//不存在文件夹则创建File directory = new File(backupFilePath);directory.mkdirs();BufferedWriter writer = new BufferedWriter(new FileWriter(path));for (Map record : records) {String insertStatement = generateInsertStatement(tableName, record, columnsDtoList) + ";";writer.write(insertStatement);writer.newLine();}writer.close();File file = new File(path);InputStream inputStream = new FileInputStream(file);MultipartFile multipartFile = new MockMultipartFile(ContentType.APPLICATION_OCTET_STREAM.toString(), inputStream);minIoUtil.upload(multipartFile, ParameterUtil.bucketNameParam, fileName);//上传后 删除本地文件file.delete();System.out.println("Backup created successfully!");} catch (IOException e) {e.printStackTrace();return new Results(500, "操作失败!");}return new Results(200, "操作成功!", fileName);}//此方法需要以数据库取出来的字段信息为准--转换成sql的方法private String generateInsertStatement(String tableName, Map<String, Object> record, List<ColumnsDto> columnsDtoList) {StringBuilder builder = new StringBuilder();builder.append("INSERT INTO ").append(tableName).append(" (");//拼接列名columnsDtoList.forEach(columns -> {builder.append(columns.getColumn_name()).append(", ");});builder.setLength(builder.length() - 2);builder.append(") VALUES (");//拼接值columnsDtoList.forEach(columns -> {Object value = record.get(columns.getColumn_name());if(value instanceof Date){Date date = (Date) value;builder.append("'").append(DateUtils.parseDateToStr(date)).append("', ");}else if(value instanceof String){builder.append("'").append(value).append("', ");}else{builder.append(value).append(", ");}});builder.setLength(builder.length() - 2);builder.append(")");return builder.toString();}//此方法用于直接取Object的字段信息做sql拼接--转换成sql的方法--已验证过private String generateInsertStatement(String tableName, Object record) {StringBuilder builder = new StringBuilder();builder.append("INSERT INTO ").append(tableName).append(" (");Arrays.stream(record.getClass().getDeclaredFields()).map(Field::getName).forEach(fieldName -> builder.append(convertCamelCaseToSnakeCase(fieldName)).append(", "));builder.setLength(builder.length() - 2);builder.append(") VALUES (");Arrays.stream(record.getClass().getDeclaredFields()).map(field -> {field.setAccessible(true);try {return field.get(record);} catch (IllegalAccessException e) {e.printStackTrace();return null;}}).forEach(value -> {if(value instanceof Date){//时间格式 转换为-YYYY_MM_DD_HH_MM_SSDate date = (Date) value;builder.append("'").append(DateUtils.parseDateToStr(date)).append("', ");}else if(value instanceof String){builder.append("'").append(value).append("', ");}else{//int/double类型 不需要单引号builder.append(value).append(", ");}});builder.setLength(builder.length() - 2);builder.append(")");return builder.toString();}//驼峰命令转换 userName-转换为-user_namepublic static String convertCamelCaseToSnakeCase(String input) {return input.replaceAll("([a-z])([A-Z]+)", "$1_$2").toLowerCase();}}

在controller中提供了两种方法,可以参考一下~,然后直接调用接口就行:

因为项目需要,我是写入文件后再上传至minio文件服务器,所以我要查看还需要去minio服务器查看下载,或者调用现有的下载接口下载~

这样就完成了根据sql文件数据备份~

相关文章:

数据备份文件生成--根据表名生成对应的sql语句文件

最近客户有个需求&#xff0c;希望在后台增加手动备份功能&#xff0c;将数据导出下载保存。 当然&#xff0c;此方法不适用于海量数据的备份&#xff0c;这只适用于少量数据的sql备份。 这是我生成的sql文件&#xff0c;以及sql文件里的insert语句&#xff0c;已亲测&#x…...

进程同步与互斥

目录 进程同步与互斥&#xff08;1&#xff09; 第一节、进程间相互作用 一、相关进程和无关进程 二、与时间有关的错误 第二节、进程同步与互斥 一、进程的同步 二、进程的互斥 三、临界区 进程同步与互斥&#xff08;2&#xff09; 三、信号量与P、V操作的物理含义…...

mysql workbench常用操作

1、No database selected Select the default DB to be used by double-clicking its name in the SCHEMAS list in the sidebar 方法一&#xff1a;双击你要使用的库 方法二&#xff1a;USE 数据库名 2、复制表名&#xff0c;字段名 3、保存链接...

【操作】国标GB28181视频监控EasyGBS平台更新设备信息时间间隔

国标GB28181协议视频平台EasyGBS是基于GB28181协议的视频监控云服务平台&#xff0c;可支持多路设备同时接入&#xff0c;并对多平台、多终端分发出RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。平台可提供视频监控直播、云端录像、云存储、检索回放、智能告警、语音对讲、平台…...

TensorFlow入门(八、TensorBoard可视化工具的应用)

TensorBoard常用函数和类http://t.csdn.cn/Hqi9c TensorBoard可视化的过程: ①确定一个整体的图表,明确从这个图表中获取哪些数据的信息 ②确定在程序的哪些节点、以什么样的方式进行汇总数据的运算,以记录信息,比如在反向传播定义以后,使用tf.summary.scalar记录损失值的变…...

升级targetSdkVersion至33(以及迁移至Androidx)

1.设置 android.useAndroidXtrue 和 android.enableJetifiertrue 2.一键迁移至androidx&#xff1a;Refactor -> Migrate to Androidx 3.手动修改未能自动迁移到androidx的部分&#xff1a; android.support.v4.view.ViewPager.PageTransformer -> androidx.viewpager.wi…...

python3.11版本pip install ddddocr调用时报错got an unexpected keyword argument ‘det‘ 解决

一、如图出现如下问题 ddddocr.__init__() got an unexpected keyword argument det出现问题原因&#xff1a;python3.11默认安装版本就旧版的ddddocr1.0的&#xff0c;所以导致如下报错 二、解决方案一&#xff08;推荐&#xff09; python3.11的环境直接安装这个即可&…...

代理IP与Socks5代理:跨界电商之安全防护与智能数据引擎

第一部分&#xff1a;跨界电商的兴起与网络安全挑战 1.1 跨界电商的崭露头角 跨界电商已经成为全球贸易的新引擎&#xff0c;企业纷纷踏上了拓展国际市场的征程。 1.2 网络安全的不容忽视 跨界电商的增长也伴随着网络安全威胁的增加。黑客攻击、数据泄露和欺诈行为等风险呈…...

如何评估一个HR是否专业?看这些标准

HR在遇到优秀的人才时&#xff0c;以往的招聘中&#xff0c;我们总以惯性思维寻找吸引人才的突破口&#xff0c;诸如体现薪酬优厚、突出平台优势甚至提高面试话术等&#xff0c;却忽略了面试官本人的人格魅力&#xff0c;本身就是公司招聘的形象代言&#xff0c;因为优秀的面试…...

WordPress主题开发( 八)之—— 模板循环详细用法

WordPress 主题开发教程手册 — 模板循环 WordPress 主题开发中&#xff0c;模板循环是一个非常关键的概念&#xff0c;它负责默认机制来输出文章内容。模板循环会遍历当前页面获取的所有文章&#xff0c;然后使用主题中的模板标签将它们格式化并输出。 模板循环的应用 Word…...

QT : 完成绘制时钟

1.头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter> #include <QTimer> #include <QTime> #include <QPaintEvent> #include <QDebug> #include <QBrush>QT_BEGIN_NAMESPACE namespace Ui { class…...

香港云服务器和日本云服务器哪个好?(详细对比)

​  购置海外服务器时&#xff0c;您是在乎网络速度?价格?稳定性?当这几个因素同时存在&#xff0c;我们该如何选择?本篇针对海外热门的两个地区&#xff0c;中国香港和日本&#xff0c;这两种云服务器谁优谁劣?各有什么亮点?逐一进行对比分析。 一、速度上来看 中国香…...

Cross Attention和 Self- Attention 的区别?

Cross Attention和Self-Attention都是深度学习中常用的注意力机制&#xff0c;用于处理序列数据&#xff0c;其中Self-Attention用于计算输入序列中每个元素之间的关系&#xff0c;Cross Attention则是计算两个不同序列中的元素之间的关系。它们的主要区别在于计算注意力分数时…...

《从零开始的Java世界》02面向对象(基础)

《从零开始的Java世界》系列主要讲解Javase部分&#xff0c;从最简单的程序设计到面向对象编程&#xff0c;再到异常处理、常用API的使用&#xff0c;最后到注解、反射&#xff0c;涵盖Java基础所需的所有知识点。学习者应该从学会如何使用&#xff0c;到知道其实现原理全方位式…...

pve关闭windows虚拟机慢

背景&#xff1a; 在web界面关闭windows虚拟机一直转圈&#xff0c;使用命令行关闭报错 qm stop 155 trying to acquire lock... cant lock file /var/lock/qemu-server/lock-155.conf - got timeout解决 删除lock&#xff0c;然后用命令行重新关闭 rm /var/lock/qemu-serve…...

【Django】 rest_framework接口开发流程及接口功能组成

rest_framework接口开发流程及接口功能组成 使用restframework框架开发接口&#xff0c;方式应该有6、7种&#xff0c;每个人的习惯不同&#xff0c;用的方法也不一样&#xff0c;再次不再一一详述。 我比较常用&#xff1a;ModelSerializerGenericAPIView 原因是用视图函数装饰…...

Kafka Log存储解析以及索引机制

1.概述 在Kafka架构&#xff0c;不管是生产者Producer还是消费者Consumer面向的都是Topic。Topic是逻辑上的概念&#xff0c;而Partition是物理上的概念。每个Partition逻辑上对应一个log文件&#xff0c;该log文件存储是Producer生产的数据。Producer生产的数据被不断追加到该…...

广告电商模式:探索新商业模式,实现三方共赢

随着互联网技术的发展&#xff0c;电商行业正在不断探索新的商业模式。其中&#xff0c;广告电商模式是一种创新的方式&#xff0c;它成功地将广告和电商相结合&#xff0c;实现了三方共赢的局面。一、广告电商模式的定义广告电商模式&#xff0c;顾名思义&#xff0c;是一种将…...

动态线程池框架DynamicTp v1.1.4大版本发布,新增若干实用特性

DynamicTp 简介 DynamicTp 是一个基于配置中心实现的轻量级动态线程池监控管理工具&#xff0c;主要功能可以总结为动态调参、通知报警、运行监控、三方包线程池管理等几大类。 DynamicTp 特性 代码零侵入&#xff1a;我们改变了线程池以往的使用姿势&#xff0c;所有配置均放…...

无线通信——Mesh自组网的多跳性

Mesh的多跳性 Mesh网络具备多跳性。什么是多跳性呢&#xff1f;上面说过&#xff0c;每一个具备Mesh网络的设备都是独立的节点。因此&#xff0c;当我发出一条数据时&#xff0c;这些数据会通过跳跃到达不同的网络节点&#xff0c;数据从一个节点跳到另一个节点&#xff0c;直到…...

Simba MCP Server:用AI助手对话式驱动贝叶斯营销组合模型分析

1. 项目概述&#xff1a;当贝叶斯营销组合模型遇上AI助手如果你是一名市场分析师、营销科学家&#xff0c;或者任何需要回答“我的营销预算到底花得值不值”的人&#xff0c;那么你对营销组合模型&#xff08;MMM&#xff09;一定不陌生。这玩意儿是量化不同营销渠道&#xff0…...

2025届学术党必备的五大AI学术助手实测分析

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek AI论文工具在当代学术领域&#xff0c;已然成为了极为关键的辅助支撑力量&#xff0c;它可全…...

Origin 9 绘图避坑指南:7个高频问题解决,让你的科研图表一次成型

Origin 9 科研绘图实战&#xff1a;7个高频问题深度解析与优化方案 科研绘图是数据可视化的重要环节&#xff0c;而Origin 9作为经典的科学绘图软件&#xff0c;其功能强大但操作细节繁多。许多用户在初次接触或日常使用中常会遇到各种棘手问题&#xff0c;导致绘图效率低下、图…...

NeumAI向量检索平台:构建生产级RAG应用的端到端Pipeline实践

1. 项目概述&#xff1a;从“Neum”到“AI”&#xff0c;一个向量检索系统的诞生最近在折腾RAG&#xff08;检索增强生成&#xff09;应用&#xff0c;发现向量检索这块的性能和成本&#xff0c;简直是决定项目成败的“命门”。自己从零开始搭一套&#xff0c;从数据清洗、向量…...

基于LLM与Playwright的智能网页自动化:Web-Use项目实战解析

1. 项目概述&#xff1a;一个能“看懂”网页的智能体 如果你也厌倦了那些重复、繁琐的网页操作——比如在不同电商平台比价、手动填写表单、或者从一堆搜索结果里筛选信息——那么今天聊的这个项目&#xff0c;你可能会非常感兴趣。它叫 Web-Use &#xff0c;本质上是一个 …...

用 LangChain 克隆一个 ChatGPT:LLMChain + Memory 实战

0 前言 ChatGPT 之所以好用&#xff0c;核心在于&#xff1a; 个性化的系统提示词多轮对话记忆 本文基于 LangChain&#xff0c;用不到 30 行代码复刻这两个能力&#xff0c;构建一个可自定义人格的对话 AI。 1 技术栈组件说明LLMChainLangChain 的核心链&#xff0c;将 LLM、P…...

从丰田SUA事件看安全关键系统软件可靠性:设计原则与工程实践

1. 项目概述&#xff1a;当软件缺陷成为致命威胁我干了十多年嵌入式开发&#xff0c;从单片机玩到复杂的汽车域控制器&#xff0c;经手的代码行数自己都数不清了。但每次看到“软件缺陷导致车辆突然加速”这类新闻&#xff0c;后背还是会发凉。这行干久了&#xff0c;你会对代码…...

深度学习提取结构光条中心线项目的对比实验与消融实验统计分析方法研究

深度学习提取结构光条中心线项目的对比实验与消融实验统计分析方法研究 1 引言 线结构光三维测量技术凭借其非接触、高精度、快速测量等优势,在工业测量、三维重建、智能制造等领域得到了广泛应用。在结构光视觉测量系统中,光条中心线的提取精度直接决定了三维重建和尺寸测…...

Windows 11本地部署最新大模型深度方案

一、方案概述 随着大语言模型的快速发展&#xff0c;本地部署已成为保护数据隐私、降低API成本的重要选择。本方案将详细介绍在Windows 11系统上部署最新大模型的完整流程&#xff0c;包括硬件配置、环境搭建、模型选择和性能优化。 二、硬件配置要求 2.1 最低配置 GPU: NVIDIA…...

PowerToys汉化完整指南:3分钟让Windows效率工具说中文

PowerToys汉化完整指南&#xff1a;3分钟让Windows效率工具说中文 【免费下载链接】PowerToys-CN PowerToys Simplified Chinese Translation 微软增强工具箱 自制汉化 项目地址: https://gitcode.com/gh_mirrors/po/PowerToys-CN 你是否曾经因为PowerToys的英文界面而感…...