本帖最后由 大山哥哥 于 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, 下载次数: 29)
Java文件:
JavaFile.zip
(1.27 KB, 下载次数: 29)
|