A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 大山哥哥 于 2018-10-26 20:31 编辑

最近从gitHub上下载了一些开源的项目,想在本地运行玩一下,因需要使用到数据库,所以项目中有大量的sql脚本需要我们自己导入到数据库中,但是因sql文件太多,自己手动导入需要的成本太高,并且sql脚本分布在不同的文件夹下面,每次导入都特别麻烦,所有就写了一个批量导入sql脚本的代码,希望对研究开源项目的小伙伴有所帮助。(sql脚本,java代码附在文章末尾处

第一:定义sql脚本的书写规范(这也是我们项目中必须的,方便后期维护)

1.因为sql脚本之间存在依赖关系,一张表可能会依赖另外的表

2.项目进行中可能会存在对表的修改操作,例如:前期已经导入一些数据进去,后期有添加或删除了表中的字段

综合上述情况,可以定义如下规则:

1.每张表单独一个文件夹,可以根据主从关系进行排序,没有关联关系的就可以随意了,例如:用户表,地址表

因为一个用户有多个地址,所以用户表为主表,地址表为从表,所以就可以创建如下图所示的文件夹格式:

这样,代码读取文件时,就可以先创建主表,后创建从表,从而不会出现因外键关联关系报错的问题。

2.文件夹内部,sql脚本也要排序(注意:正常开发中,每次对数据库的操作,不论是增删改操作,都要单独创建一个sql文件。方案有很多这里只说一种),那么我们sqljia脚本的命名可以参考上面文件夹的命名方式,如下图:

这样,代码可以根据我们对数据的操作顺序来完成对数据库的操作。

所有sql脚本中的代码如下:

[SQL] 纯文本查看 复制代码
#tb_user表
#001_createUser.sql文件内容
CREATE TABLE `tb_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `password` varchar(32) NOT NULL COMMENT '密码,加密存储',
  `phone` varchar(20) DEFAULT NULL COMMENT '注册手机号',
  `email` varchar(50) DEFAULT NULL COMMENT '注册邮箱',
  `birthday` datetime DEFAULT NULL COMMENT '生日',
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='用户表';
#002_insertUser.sql文件内容
insert  into `tb_user`(`id`,`username`,`password`,`phone`,`email`,`birthday`) values (16,'小张','123','18812345678','xiaoz@163.com','2008-10-10 12:12:12');
insert  into `tb_user`(`id`,`username`,`password`,`phone`,`email`,`birthday`) values (17,'小王','123','18812345678','xiaow@163.com','2008-10-10 12:12:12');
insert  into `tb_user`(`id`,`username`,`password`,`phone`,`email`,`birthday`) values (18,'小李','123','18812345678','xiaol@163.com','2008-10-10 12:12:12');
insert  into `tb_user`(`id`,`username`,`password`,`phone`,`email`,`birthday`) values (19,'小赵','123','18812345678','xiaoz@163.com','2008-10-10 12:12:12');
insert  into `tb_user`(`id`,`username`,`password`,`phone`,`email`,`birthday`) values (20,'小刘','123','18812345678','xiaoliu@163.com','2008-10-10 12:12:12');
insert  into `tb_user`(`id`,`username`,`password`,`phone`,`email`,`birthday`) values (21,'小单','123','18812345678','xiaod@163.com','2008-10-10 12:12:12');
insert  into `tb_user`(`id`,`username`,`password`,`phone`,`email`,`birthday`) values (22,'小蔡','123','18812345678','xiaoc@163.com','2008-10-10 12:12:12');
insert  into `tb_user`(`id`,`username`,`password`,`phone`,`email`,`birthday`) values (23,'小马','123','18812345678','xiaom@163.com','2008-10-10 12:12:12');
insert  into `tb_user`(`id`,`username`,`password`,`phone`,`email`,`birthday`) values (24,'小候','123','18812345678','xiaoh@163.com','2008-10-10 12:12:12');
insert  into `tb_user`(`id`,`username`,`password`,`phone`,`email`,`birthday`) values (25,'小徐','123','18812345678','xiaox@163.com','2008-10-10 12:12:12');
insert  into `tb_user`(`id`,`username`,`password`,`phone`,`email`,`birthday`) values (26,'小田','123','18812345678','xiaot@163.com','2008-10-10 12:12:12');
#003_update_addColumn.sql文件内容
alter table tb_user add column sex char(1) DEFAULT '1' COMMENT '性别:0-女,1-男';
#004_inserUser.sql文件内容
insert  into `tb_user`(`id`,`username`,`password`,`phone`,`email`,`birthday`,`sex`) values (30,'小红','123','18812345678','xiaoh@163.com','2008-10-10 12:12:12','0');
insert  into `tb_user`(`id`,`username`,`password`,`phone`,`email`,`birthday`,`sex`) values (31,'小兰','123','18812345678','xiaolan@163.com','2008-10-10 12:12:12','0');
insert  into `tb_user`(`id`,`username`,`password`,`phone`,`email`,`birthday`,`sex`) values (32,'小紫','123','18812345678','xiaolan@163.com','2008-10-10 12:12:12','0');
#---------------------------------------------------------------------------------------------------------------------------------------------------------------------
#tb_address
#001_createAddress.sql文件内容
CREATE TABLE `tb_address` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(50) DEFAULT NULL COMMENT '用户ID',
  `province` varchar(10) DEFAULT NULL COMMENT '省',
  `city` varchar(10) DEFAULT NULL COMMENT '市',
  `town` varchar(10) DEFAULT NULL COMMENT '县/区',
  `address` varchar(255) DEFAULT NULL COMMENT '详细地址',
  `alias` varchar(50) DEFAULT NULL COMMENT '别名',
  PRIMARY KEY (`id`),
  foreign key (`user_id`) references tb_user (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

sql脚本按规则准备完毕,下面就可以开始代码测试。测试代码如下:

[Java] 纯文本查看 复制代码
package com.itheima.test;

import java.io.*;
import com.ibatis.db.util.ScriptRunner;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 
 * 描述:批量导入sql脚本
 * @author zhuan
 * @version 2018年10月26日 下午8:22:28
 */
public class MysqlFile {
        public static void main(String[] args) throws Exception {
                test("D:/mysql_sql", "mysql_sql");//调用测试方法,参数一:所有sql脚本所在文件夹路径 参数二:mysql数据库中“数据库”的名字
        }
        // 遍历
        private static void test(String fileDir, String dbname) throws Exception {
                List<File> fileList = new ArrayList<File>();//1.声明保存sql文件集合
                File file = new File(fileDir);//获取指定“文件夹”下所有 文件+文件夹
                File[] files = file.listFiles();
                if (files == null) {//如果文件为空直接返回
                        return;
                }
                for (File f : files) {
                        if (f.isFile()) {//文件不为空且为文件
                                // 查找.sql结尾的文件
                                int sql = f.getName().indexOf(".sql");
                                if (sql != -1) {
                                        fileList.add(f);
                                }
                        } else if (f.isDirectory()) {//如果是文件夹,接着遍历文件夹下内容
                                test(f.getAbsolutePath(), dbname);
                        }

                }
                for (File f1 : fileList) {//遍历所有sql文件
                        String s = f1.getAbsolutePath();
                        readSQLFile(s, dbname);//执行sql脚本
                }
        }
        // 执行sql文件
        public static void readSQLFile(String path, String dbname) throws Exception {
                Map<String, String> paramMap = new HashMap<>();
                paramMap.put("driver", "com.mysql.jdbc.Driver");
                paramMap.put("url", "jdbc:mysql://localhost:3306/"+dbname+"?characterEncoding=utf-8");
                paramMap.put("username", "root");//用户名,密码也可以自己单独提取出去
                paramMap.put("password", "root");
                paramMap.put("stopOnError", "true");//设置错误停止
                paramMap.put("autoCommit", "false");
                ScriptRunner runner = new ScriptRunner(paramMap);
                runner.setLogWriter(null);
                runner.runScript(new InputStreamReader(new FileInputStream(path), "UTF-8"));
        }
}

上述代码中注释很详细,此处就不再赘述。

注意:sql文件的编码格式要是UTF-8无bom的编码格式,要不可能会报错会出现乱码问题


SQL脚本打包: mysql_sql.zip (2.47 KB, 下载次数: 28)
Java文件: JavaFile.zip (1.27 KB, 下载次数: 28)

mysql_sql.zip

2.47 KB, 下载次数: 20

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马