Java 使用JDBC备份数据库中的表和数据
侧边栏壁纸
  • 累计撰写 190 篇文章
  • 累计收到 1,268 条评论

Java 使用JDBC备份数据库中的表和数据

萧瑟
2023-04-28 / 4 评论 / 139 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年05月23日,已超过547天没有更新,若内容或图片失效,请留言反馈。

实现思路

  1. 加载数据库驱动程序并建立数据库连接。
  2. 使用JDBC API查询需要备份的表格和数据。
  3. 在输出文件中以适当的格式编写SQL语句来创建表格。
  4. 用适当的格式编写INSERT语句将行数据写入输出文件。
    5.
    关闭所有数据库连接和输出文件。

实现代码

package com.yanqingshan.admin.jdbc;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.FileWriter;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;

import java.util.List;

/**
 * 通过JDBC备份 库表数据
 *
 * @author yanqs
 * @date 2023年04月28日 9:31
 */
@Slf4j
@SpringBootTest
class BuildSql {

    @Test
    void testBuildSql() throws ClassNotFoundException, SQLException, IOException {
        String dbUrl = "jdbc:mysql://192.168.57.110:3306/boot-startup";
        String username = "test";
        String password = "123456";

        // 加载JDBC驱动程序
        Class.forName("com.mysql.cj.jdbc.Driver");

        // 建立数据库连接
        Connection conn = DriverManager.getConnection(dbUrl, username, password);

        // 创建Statement对象
        Statement stmt = conn.createStatement();

        // 查询所有表格名字
        ResultSet result = stmt.executeQuery("SHOW TABLES");
        // 备份的SQL文件
        FileWriter writer = new FileWriter("backup.sql");

        // 循环遍历所有表 存表
        List<String> tableNameList = new ArrayList<>();
        while (result.next()) {
            tableNameList.add(result.getString(1));
        }
        for (String tableName : tableNameList) {
            log.info("开始备份“{}”表结构", tableName);
            // 在输出文件中写入创建表格SQL语句
            ResultSet rs = stmt.executeQuery("SHOW CREATE TABLE " + tableName);
            if (rs.next()) {
                writer.write("\n\n" + rs.getString(2) + ";\n\n");
            }

            // 循环遍历表格中的所有行来写入数据
            rs = stmt.executeQuery("SELECT * FROM " + tableName);
            int columnCount = rs.getMetaData().getColumnCount();
            log.info("开始生成“{}”表数据", tableName);
            while (rs.next()) {
                writer.write("INSERT INTO " + tableName + " VALUES (");
                for (int i = 1; i <= columnCount; i++) {
                    writer.write("'" + rs.getString(i) + "'");
                    if (i < columnCount) {
                        writer.write(",");
                    }
                }
                writer.write(");\n");
            }
        }

        // 关闭所有连接
        writer.close();
        result.close();
        stmt.close();
        conn.close();
        log.info("备份完成");
    }
}

实现效果

效果展示

评论 (4)

取消
  1. 头像
    vian
    河南省郑州市 Windows 10 · Microsoft Edge

    之前看到了一种自动备份的方法 好像存在风险 就没搞

    回复
    1. 头像
      萧瑟 作者
      北京市 MacOS · Google Chrome
      @ vian

      只是项目中有这个需求,使用程序实现而非工具;内部使用,应该不会存在风险。而且这个代码是ChatGPT帮我完善的表情

      回复
  2. 头像
    wu先生
    湖北省黄冈市 Windows 10 · Microsoft Edge

    不明觉历呀。表情

    回复
    1. 头像
      萧瑟 作者
      北京市 MacOS · Google Chrome
      @ wu先生

      只是简单记录一下而已。表情

      回复