java脚本之导出数据表SQL

2022-09-14 13:18:39

导出数据表SQL,通常我们会使用第三方工具,如Navicat等,导出可保存为脚本,可重复执行,相当方便了。如果不要求脚本灵活性,使用工具当然更香了。

第三方包

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.5</version></dependency>

数据库配置

创建db.setting文件,放 /resources 文件夹即可,支持多数据源,定义多个 [xxx] 即可

## 数据库连接信息
[test-db-dev]
url = jdbc:mysql://xx.xxx.xxx.xxx:3306/test_db
user = root
pass = xxxxxx

脚本

importcn.hutool.core.collection.CollectionUtil;importcn.hutool.core.io.file.FileWriter;importcn.hutool.core.text.StrBuilder;importcn.hutool.core.util.ObjectUtil;importcn.hutool.core.util.StrUtil;importcn.hutool.db.Db;importcn.hutool.db.DbUtil;importcn.hutool.db.Entity;importcn.hutool.db.ds.DSFactory;importlombok.Data;importlombok.SneakyThrows;importlombok.experimental.Accessors;importjava.io.File;importjava.util.List;/**
 * 生成的sql:删除表 + 创建表 + insert
 *
 * @author jason
 */publicclassCreateAndInsertSqlJob{privatestaticfinalString FILE_NAME="/data/sql/【系统生成】删除表+创建表+insert.sql";/**
     * 需要生成的表
     */privatestaticfinalList<TempBean> CONFIG_LIST=CollectionUtil.newArrayList(newTempBean().setTable("table"),newTempBean().setTable("table").setCreate(false));/**
     * 不需要生成的字段:如虚拟列
     */privatestaticfinalList<String> filedIgnoreList=CollectionUtil.newArrayList("","","");publicstaticvoidmain(String[] args){CreateAndInsertSqlJob.start("test-db-dev","test_db");}/**
     * 生成 sql
     *
     * @param dbSetting 配置名 如配置:[test-db-dev],这里传 test-db-dev
     * @param dbName    数据库名
     */@SneakyThrowspublicstaticvoidstart(String dbSetting,String dbName){Db db=DbUtil.use(DSFactory.get(dbSetting));FileWriter sqlFileWriter=FileWriter.create(newFile(FILE_NAME));
        sqlFileWriter.write("");
        sqlFileWriter.append("USE "+ dbName+";\n");
        sqlFileWriter.append("SET NAMES utf8mb4;\n");
        sqlFileWriter.append("SET FOREIGN_KEY_CHECKS = 0;\n");for(TempBean tempBean: CONFIG_LIST){String table= tempBean.table;
            sqlFileWriter.append("\n\n\n");if(tempBean.create){// DROP TABLE
                sqlFileWriter.append("DROP TABLE IF EXISTS `"+ table+"`;\n");// CREATE TABLEEntity createTableEntity= db.queryOne("SHOW CREATE TABLE "+ table);
                sqlFileWriter.append((String) createTableEntity.get("Create Table"));
                sqlFileWriter.append(";\n");}// 看配置,是否需要insert语句if(tempBean.insert){// INSERT INTOList<Entity> dataEntityList= db.query("SELECT * FROM "+ table);for(Entity dataEntity: dataEntityList){StrBuilder field=StrBuilder.create();StrBuilder data=StrBuilder.create();

                    dataEntity.forEach((key, valueObj)->{String valueStr=StrUtil.toStringOrNull(valueObj);// 看配置,某些列不需要if(filedIgnoreList.contains(key)){return;}
                        field.append("`").append(key).append("`").append(", ");if(ObjectUtil.isNotNull(valueStr)){// 值包含 ' 转义处理
                            valueStr=StrUtil.replace(valueStr,"'","\\'");// boolean 值处理if(StrUtil.equals("true", valueStr)){
                                data.append("b'1'");}elseif(StrUtil.equals("false", valueStr)){
                                data.append("b'0'");}else{
                                data.append("'").append(valueStr).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");}@Data@Accessors(chain=true)staticclassTempBean{/**
         * 表名
         */publicString table;/**
         * 是否需要 create 建表语句,默认需要
         */publicBoolean create=true;/**
         * 是否需要 insert 语句,默认需要
         */publicBoolean insert=true;}}

生成文件

在这里插入图片描述

  • 作者:梦想blog
  • 原文链接:https://blog.csdn.net/z1353095373/article/details/109679268
    更新时间:2022-09-14 13:18:39