之所以做这个功能的原因是我的服务器上的数据库被攻击了,还好服务器上没有什么重要的数据,但是数据没了就很肉疼,因此做了这个功能,用来定时备份数据库数据
添加依赖
这里用到了 hutool 工具包 这个包挺好用的,推荐大家可以多看看他的官方文档
官方文档:https://www.hutool.cn/docs/#/
<!-- hutool工具类-->
<dependency>
<groupid>cn.hutool</groupid>
<artifactid>hutool-all</artifactid>
<version>5.3.3</version>
</dependency>添加配置文件和配置
因为这里只是需要导出sql 所以就使用了hutool工具中的db
在resources目录下创建db.setting数据库配置文件
文件中内容:
## url 数据库连接地址 ## user 连接数据库账号 ## pass 连接数据库密码 url = jdbc:mysql://localhost:3306/test user = root pass = 123456
紧接着在application.yml文件中添加sql文件的存放的路径
# 导出sql文件的位置 sql: dbname: notepad # 数据库名 filepath: /data/sql/ # 导出sql文件的位置 win下会直接在项目所在磁盘下建立 data/sql文件
编写导出sql的方法
方法直接贴在下面:
package com.an.notepad.task;
import cn.hutool.core.collection.collectionutil;
import cn.hutool.core.date.datetime;
import cn.hutool.core.io.file.filewriter;
import cn.hutool.core.text.strbuilder;
import cn.hutool.core.util.objectutil;
import cn.hutool.core.util.strutil;
import cn.hutool.db.db;
import cn.hutool.db.entity;
import cn.hutool.db.ds.dsfactory;
import lombok.data;
import lombok.sneakythrows;
import lombok.experimental.accessors;
import org.slf4j.logger;
import org.slf4j.loggerfactory;
import org.springframework.beans.factory.annotation.value;
import org.springframework.context.annotation.configuration;
import javax.sql.datasource;
import java.io.file;
import java.sql.connection;
import java.sql.databasemetadata;
import java.util.list;
@configuration
public class exportsql {
// 用于打印执行日志
private static final logger logger = loggerfactory.getlogger(exportsql.class);
// 存储的路径
@value("${sql.filepath}")
private string filepath;
// 数据库名
@value("${sql.dbname}")
private string database_name;
// 需要导出的表名
private final list<tempbean> tempbeanlist = collectionutil.newarraylist(
// 这里写需要存储的表名 有几张表就new几个
new tempbean().settable("n_note"),
new tempbean().settable("n_user")
);
@sneakythrows
public void export() {
//获取默认数据源
datasource ds = dsfactory.get();
// 获取数据库连接对象
connection connection = ds.getconnection();
// 获取连接信息
databasemetadata metadata = connection.getmetadata();
// 创建sql文件对象
filewriter sqlfilewriter = filewriter.create(new file(filepath + database_name + ".sql"));
sqlfilewriter.write("");
sqlfilewriter.append("use " + database_name + ";\n");
sqlfilewriter.append("/*\n");
sqlfilewriter.append(" --------------------------------------------------\n");
sqlfilewriter.append(" target server type : " + metadata.getdatabaseproductname() + ";\n");
sqlfilewriter.append(" target server version : " + metadata.getdatabaseproductversion() + ";\n");
sqlfilewriter.append(" \n");
sqlfilewriter.append(" target server date : " + datetime.now() + ";\n");
sqlfilewriter.append(" \n");
sqlfilewriter.append(" --------------------------------------------------\n");
sqlfilewriter.append("*/\n");
sqlfilewriter.append("set names utf8mb4;\n");
sqlfilewriter.append("set foreign_key_checks = 0;\n");
for (tempbean tempbean : tempbeanlist) {
string table = tempbean.table;
sqlfilewriter.append("\n\n\n");
// drop table
sqlfilewriter.append("drop table if exists `" + table + "`;\n");
// create table
entity createtableentity = db.use().queryone("show create table " + table);
sqlfilewriter.append((string) createtableentity.get("create table"));
sqlfilewriter.append(";\n");
// 看配置,是否需要insert语句
if (!tempbean.insert) {
continue;
}
// insert into
list<entity> dataentitylist = db.use().query("select * from " + table);
for (entity dataentity : dataentitylist) {
strbuilder field = strbuilder.create();
strbuilder data = strbuilder.create();
dataentity.foreach((key, value) -> {
field.append(key).append(", ");
if (objectutil.isnotnull(value)) {
if (strutil.equals("true", string.valueof(value))) {
data.append("b'1'");
} else if (strutil.equals("false", string.valueof(value))) {
data.append("b'0'");
} else {
data.append("'").append(value).append("'");
}
} else {
data.append("null");
}
data.append(", ");
});
sqlfilewriter.append("insert into `" + table + "`(");
string fieldstr = field.substring(0, field.length() - 2);
sqlfilewriter.append(fieldstr);
sqlfilewriter.append(") values (");
string datastr = data.substring(0, data.length() - 2);
sqlfilewriter.append(datastr);
sqlfilewriter.append(");\n");
}
}
sqlfilewriter.append("\n\n\n");
sqlfilewriter.append("set foreign_key_checks = 1;\n");
logger.info(">>>>>>>>>> 存储sql成功" + datetime.now());
}
@data
@accessors(chain = true)
static class tempbean {
// 表名
public string table;
// 是否需要insert语句,默认需要 (表中数据)
public boolean insert = true;
}
}创建定时任务
package com.an.notepad.task;
import org.slf4j.logger;
import org.slf4j.loggerfactory;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.context.annotation.configuration;
import org.springframework.scheduling.annotation.enablescheduling;
import org.springframework.scheduling.annotation.scheduled;
/**
* 定时导出数据库sql功能
*/
@configuration
@enablescheduling // 开启定时任务
public class exporttask {
@autowired
private exportsql exportsql;
//@scheduled(cron = "0 0 1 * * ?") // 每天凌晨1点触发一次
@scheduled(cron = "*/5 * * * * ?") // 5秒触发一次
public void task() {
exportsql.export();
}
}
编写完成 运行测试一下

我这里项目在d盘中,因此d盘下d:\data\sql 默认会有生成的文件


成功,我这边测试了一下,数据库是可以导入的
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论