之所以做这个功能的原因是我的服务器上的数据库被攻击了,还好服务器上没有什么重要的数据,但是数据没了就很肉疼,因此做了这个功能,用来定时备份数据库数据
添加依赖
这里用到了 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
默认会有生成的文件
成功,我这边测试了一下,数据库是可以导入的
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论