利用Java来进行Mysql数据库的导入和导出的总体思想是通过Java来调用命令窗口执行相应的命令。
MySql导出数据库的命令如下:
mysqldump-uusername-ppassword-hhost-PportexportDatabaseName>exportPath
利用Java调用命令窗口执行命令来进行MySql导入数据库一般分三步走:
第一步:登录Mysql数据库,在登录数据库的时候也可以指定登录到哪个数据库,如果指定了则可以跳过第二步;
第二步:切换数据库到需要导入的目标数据库
第三步:利用命令开始导入
在进行导出的时候,需要注意命令语句的运行环境,如果已经将mysql安装路径下的bin加入到系统的path变量中,那么在导出的时候可以直接使用命令语句,否则,就需要在执行命令语句的时候加上命令所在位置的路径,即mysql安装路径想的bin下的mysqldump命令。
基本代码如下:
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.io.OutputStreamWriter;
importjava.util.Properties;
/**
*在进行导出的时候,需要注意命令语句的运行环境,如果已经将mysql安装路径下的bin加入到
*系统的path变量中,那么在导出的时候可以直接使用命令语句,否则,就需要在执行命令语句的
*时候加上命令所在位置的路径,即mysql安装路径想的bin下的mysqldump命令
*@authorandy
*
*/
publicclassMySqlImportAndExport{
publicstaticvoidmain(Stringargs[])throwsIOException{
InputStreamis=MySqlImportAndExport.class.getClassLoader().getResourceAsStream("jdbc.properties");
Propertiesproperties=newProperties();
properties.load(is);
//MySqlImportAndExport.export(properties);//这里简单点异常我就直接往上抛
MySqlImportAndExport.importSql(properties);
}
/**
*根据属性文件的配置导出指定位置的指定数据库到指定位置
*@paramproperties
*@throwsIOException
*/
publicstaticvoidexport(Propertiesproperties)throwsIOException{
Runtimeruntime=Runtime.getRuntime();
Stringcommand=getExportCommand(properties);
runtime.exec(command);//这里简单一点异常我就直接往上抛
}
/**
*根据属性文件的配置把指定位置的指定文件内容导入到指定的数据库中
*在命令窗口进行mysql的数据库导入一般分三步走:
*第一步是登到到mysql;mysql-uusername-ppassword-hhost-Pport-DdatabaseName;如果在登录的时候指定了数据库名则会
*直接转向该数据库,这样就可以跳过第二步,直接第三步;
*第二步是切换到导入的目标数据库;useimportDatabaseName;
*第三步是开始从目标文件导入数据到目标数据库;sourceimportPath;
*@paramproperties
*@throwsIOException
*/
publicstaticvoidimportSql(Propertiesproperties)throwsIOException{
Runtimeruntime=Runtime.getRuntime();
//因为在命令窗口进行mysql数据库的导入一般分三步走,所以所执行的命令将以字符串数组的形式出现
Stringcmdarray[]=getImportCommand(properties);//根据属性文件的配置获取数据库导入所需的命令,组成一个数组
//runtime.exec(cmdarray);//这里也是简单的直接抛出异常
Processprocess=runtime.exec(cmdarray[0]);
//执行了第一条命令以后已经登录到mysql了,所以之后就是利用mysql的命令窗口
//进程执行后面的代码
OutputStreamos=process.getOutputStream();
OutputStreamWriterwriter=newOutputStreamWriter(os);
//命令1和命令2要放在一起执行
writer.write(cmdarray[1]+"\r\n"+cmdarray[2]);
writer.flush();
writer.close();
os.close();
}
/**
*利用属性文件提供的配置来拼装命令语句
*在拼装命令语句的时候有一点是需要注意的:一般我们在命令窗口直接使用命令来
*进行导出的时候可以简单使用“>”来表示导出到什么地方,即mysqldump-uusername-ppassworddatabaseName>exportPath,
*但在Java中这样写是不行的,它需要你用-r明确的指出导出到什么地方,如:
*mysqldump-uusername-ppassworddatabaseName-rexportPath。
*@paramproperties
*@return
*/
privatestaticStringgetExportCommand(Propertiesproperties){
StringBuffercommand=newStringBuffer();
Stringusername=properties.getProperty("jdbc.username");//用户名
Stringpassword=properties.getProperty("jdbc.password");//用户密码
StringexportDatabaseName=properties.getProperty("jdbc.exportDatabaseName");//需要导出的数据库名
Stringhost=properties.getProperty("jdbc.host");//从哪个主机导出数据库,如果没有指定这个值,则默认取localhost
Stringport=properties.getProperty("jdbc.port");//使用的端口号
StringexportPath=properties.getProperty("jdbc.exportPath");//导出路径
//注意哪些地方要空格,哪些不要空格
command.append("mysqldump-u").append(username).append("-p").append(password)//密码是用的小p,而端口是用的大P。
.append("-h").append(host).append("-P").append(port).append("").append(exportDatabaseName).append("-r").append(exportPath);
returncommand.toString();
}
/**
*根据属性文件的配置,分三步走获取从目标文件导入数据到目标数据库所需的命令
*如果在登录的时候指定了数据库名则会
*直接转向该数据库,这样就可以跳过第二步,直接第三步;
*@paramproperties
*@return
*/
privatestaticString[]getImportCommand(Propertiesproperties){
Stringusername=properties.getProperty("jdbc.username");//用户名
Stringpassword=properties.getProperty("jdbc.password");//密码
Stringhost=properties.getProperty("jdbc.host");//导入的目标数据库所在的主机
Stringport=properties.getProperty("jdbc.port");//使用的端口号
StringimportDatabaseName=properties.getProperty("jdbc.importDatabaseName");//导入的目标数据库的名称
StringimportPath=properties.getProperty("jdbc.importPath");//导入的目标文件所在的位置
//第一步,获取登录命令语句
StringloginCommand=newStringBuffer().append("mysql-u").append(username).append("-p").append(password).append("-h").append(host)
.append("-P").append(port).toString();
//第二步,获取切换数据库到目标数据库的命令语句
StringswitchCommand=newStringBuffer("use").append(importDatabaseName).toString();
//第三步,获取导入的命令语句
StringimportCommand=newStringBuffer("source").append(importPath).toString();
//需要返回的命令语句数组
String[]commands=newString[]{loginCommand,switchCommand,importCommand};
returncommands;
}
}
上述使用的jdbc.properties文件
jdbc.username=root
jdbc.password=password
jdbc.host=localhost
jdbc.port=3306
jdbc.exportDatabaseName=dbName
jdbc.exportPath=d\:\\dbName.sql
jdbc.importDatabaseName=test
jdbc.importPath=d\:\\dbName.sql