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

这篇具有很好参考价值的文章主要介绍了数据备份文件生成--根据表名生成对应的sql语句文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

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

项目是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">
    SELECT
      column_name,
      data_type
    FROM
      information_schema.COLUMNS
    WHERE
      table_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 {

    @Autowired
    private UserService userService;

    @Resource
    MinIoUtil 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_SS
                        Date 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_name
    public static String convertCamelCaseToSnakeCase(String input) {
        return input.replaceAll("([a-z])([A-Z]+)", "$1_$2").toLowerCase();
    }


}

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

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

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

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

这样就完成了根据sql文件数据备份~文章来源地址https://www.toymoban.com/news/detail-730879.html

到了这里,关于数据备份文件生成--根据表名生成对应的sql语句文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mysql数据备份批处理文件正式版已测试通过

    中心思想找到源文件(.ibd)备份到目的地成.sql文件 1.比如备份 test1和test2 表 2.加载部分表 后续更新 说明: 备份的文件并非一定要求后缀名为.sql,例如后缀名为.txt的文件也是可以的。 示范

    2024年02月11日
    浏览(53)
  • !!!!建议收藏 Rsync项目实践:数据备份 (文件同步到服务器)

    基本备份要求 准备三台服务器,两台web服务器、一台rsync备份服务器 主机名分别为web01、web02、backup [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rLf7EhNj-1666099690586)(…/…/图片/image-20221018164708556.png)] 客户端需求 1.客户端每天凌晨01点在服务器本地

    2023年04月08日
    浏览(66)
  • 【PostgreSql】本地备份为dump文件与恢复数据库(单表和整个数据库)

    环境: windows 数据库: postgresql 1.准备脚本 backUpDb.bat 脚本为备份脚本,双击运行,右键可以选择编辑; restoreDb.bat 脚本为恢复脚本,双击运行,右键选择编辑; 1.1 脚本介绍 如上图所示编辑脚本文件,选择你的备份路径和相应的程序执行路径,以及要备份的数据库名称,登录

    2024年01月23日
    浏览(32)
  • linux文件数据同步--实现文件共享与备份(nfs+rsync+httpd+dns)

    目录 实验目地: 实验需求: 各项服务位置以及作用: 整体实验过程: 详细配置: Rsync服务: Web服务:  NFS服务 DNS服务 在整体实验中,使客户机在网页可以看到由服务器A上传的文件,并且A服务器有一台备份服务器。 四台虚拟服务器与一台客户机,并关闭防火墙 服务器

    2024年02月03日
    浏览(40)
  • 还原Sql Server数据库BAK备份文件的三种方式及常见错误

    这是演示的是Sql Server 2008R2版本,不同版本可能有细微差别 右键点击数据库→还原数据库    在还原的源中选择源设备→点击选择框  在指定备份中点击添加→选择具体文件→确定→确定  勾选用于还原的备份集→这时目标数据库中会自动生成目标数据库名,在此选择即可→

    2023年04月08日
    浏览(46)
  • Windows环境下通过 系统定时 执行脚本方式 压缩并备份文件夹 到其他数据盘

    压缩时需要使用7-zip进行调用,因此根据自己电脑进行安装 官网:https://www.7-zip.org/ 新建记事本文件,重命名为git_back_up.bat 注意:如果不设置可能会导致定时任务无法执行 开“控制面板-管理工具-本地安全策略”,选择“安全设置-本地策略-安全选项”,在右边列表中找到“

    2024年02月14日
    浏览(45)
  • Raid5阵列数据恢复+Openmediavault配置内网与外网远程访问+服务器到服务器的大量文件转移备份

    1、OpenMediaVault,是一个开源的(免费)基于Debian Linux的下一代网络附加存储(NAS)解决方案。 2、易于使用的 WEB 管理界面:OpenMediaVault 的用户界面设计直观,即使是没有 Linux 经验的用户也能轻松上手。与其他流行的 NAS 解决方案相比,例如 FreeNAS(现更名为 TrueNAS CORE)和 Synol

    2024年03月15日
    浏览(42)
  • 数据备份系列:Rsync 备份详解(一)

    支持拷贝特殊文件,如连接文件、设备等。 可以有排除指定文件或目录同步的功能,相当于打包命令 tar 的排除功能。 可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变(参数:–p)。 可以实现增量同步,既只同步发生变化的数据,因此数

    2024年02月01日
    浏览(29)
  • 【MySQL】数据备份(导出数据 / 导入数据)

     SELECT...INTO OUTFILE 是 MySQL 用于导出数据的语句,它允许将查询结果保存到指定的文件中。 该语句的基本语法如下:   column1, column2, ... :要导出的列名。 INTO OUTFILE \\\'file_path\\\' :指定导出数据时要保存到的文件路径。 FIELDS TERMINATED BY \\\'field_separator\\\' :指定字段之间的分隔符,默认

    2024年02月12日
    浏览(32)
  • 微信新旧手机聊天数据备份迁移&pc端微信数据备份迁移至手机

    我相信,微信这个app已经深入大家的工作生活了,微信的数据日积月累肯定是相当大的,而我们的电子产品(手机)的更新迭代相当频繁,新的手机如何将旧手机的微信数据迁移过来呢?阅读这篇博文,你将深入了解2种迁移方案,以后妈妈再也不怕我新手机没有微信聊天数据

    2024年04月15日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包