`
iuhiqnehc
  • 浏览: 13679 次
社区版块
存档分类
最新评论

MySQL导入导出数据库

 
阅读更多
package cn.com;
 
import java.io.IOException;
 
import java.io.InputStream;
 
import java.io.OutputStream;
 
import java.io.OutputStreamWriter;
 
import java.util.Properties;
 
/**
  * MySQL导入导出数据库。总体思想是通过Java来调用命令窗口执行相应的命令。
  * 
 * MySql导出数据库命令:mysqldump -uusername -ppassword -hhost -Pport exportDatabaseName
  * > exportPath
  * 
 * 导入数据库分三步:
  * 
 * 1.登录Mysql数据库,在登录数据库的时候也可以指定登录到哪个数据库,如果指定了则可以跳过第二步
 
;
  * 
 * 2.切换数据库到需要导入的目标数据库
  * 
 * 3.利用命令开始导入
  */
 public class MySqlImportAndExport {
 
 /**
   * 根据属性文件的配置导出数据库
   * 
  * 在进行导出的时候,需要注意命令语句的运行环境,如果已经将mysql安装路径下的bin加入到系
 
统的path变量
   * 
  * 中,那么在导出的时候可以直接使用命令语句,否则,就需要在执行命令语句的时候加上命令所
 
在位置的路径,
   * 
  * 即mysql安装路径下的bin下的mysqldump命令。
   * 
  * @param properties
   * @throws IOException
   */
  public static void export(Properties properties) throws IOException {
   Runtime runtime = Runtime.getRuntime();
   String command = getExportCommand(properties);
   runtime.exec(command);
  }
 
 /**
   * 根据属性文件的配置把指定位置的指定文件内容导入到指定的数据库中
   * 
  * @param properties
   * @throws IOException
   */
  public static void importSql(Properties properties) throws IOException {
   Runtime runtime = Runtime.getRuntime();
   // 因为在命令窗口进行mysql数据库的导入一般分三步走,所以所执行的命令将以字符串数组的形式出现
   String cmdarray[] = getImportCommand(properties);
   // 执行了第一条命令以后已经登录到mysql了,所以之后就是利用mysql的命令窗口
   Process process = runtime.exec(cmdarray[0]);
   // 进程执行后面的代码
   OutputStream os = process.getOutputStream();
   OutputStreamWriter writer = new OutputStreamWriter(os);
   // 命令1和命令2要放在一起执行
   writer.write(cmdarray[1] + "\r\n" + cmdarray[2]);
   writer.flush();
   writer.close();
   os.close();
  }
 
 /**
   * 根据属性文件的配置,拼装命令语句
   * 
  * 注意:一般我们在命令窗口直接使用命令来进行导出的时候可以简单使用">"来表示导出到什么地方,
   * 
  * 即mysqldump -uusername -ppassword databaseName > exportPath,
   * 
  * 但在Java中这样写是不行的,它需要你用-r明确的指出导出到什么地方,如:
   * 
  * mysqldump -uusername -ppassword databaseName -r exportPath.
   * 
  * @param properties
   * @return
   */
 
 private static String getExportCommand(Properties properties) {
   StringBuffer command = new StringBuffer();
   // 用户名
   String username = properties.getProperty("jdbc.username");
   // 用户密码
   String password = properties.getProperty("jdbc.password");
   // 需要导出的数据库名
   String exportDatabaseName = properties
     .getProperty("jdbc.exportDatabaseName");
   // 从哪个主机导出数据库,默认取localhost
   String host = properties.getProperty("jdbc.host");
   // 端口号
   String port = properties.getProperty("jdbc.port");
   // 导出路径
   String exportPath = properties.getProperty("jdbc.exportPath");
 
  // 注意哪些地方要空格,哪些不要空格。密码是用的小p,而端口是用的大P。
   command.append("mysqldump -u").append(username).append(" -p")
     .append(password).append(" -h").append(host).append(" -P")
     .append(port).append(" ").append(exportDatabaseName)
     .append(" -r ").append(exportPath);
   return command.toString();
  }
 
 /**
   * 根据属性文件的配置,获取数据库导入所需的命令,组成一个数组
   * 
  * 在命令窗口进行mysql的数据库导入一般分三步走:
   * 
  * 1.登录到mysql数据库。 mysql -uusername -ppassword -hhost -Pport -DdatabaseName;
   * 
  * 如果在登录的时候指定了数据库名则会直接转向该数据库,这样就可以跳过第二步;
   * 
  * 2.切换到需要导入的目标数据库。use importDatabaseName;
   * 
  * 3.从目标文件导入数据到目标数据库。source importPath;
   * 
  * @param properties
   * @return
   */
 
 private static String[] getImportCommand(Properties properties) {
   // 用户名
   String username = properties.getProperty("jdbc.username");
   // 密码
   String password = properties.getProperty("jdbc.password");
   // 导入的目标数据库所在的主机
   String host = properties.getProperty("jdbc.host");
   // 端口号
   String port = properties.getProperty("jdbc.port");
   // 导入的目标数据库的名称
  String importDatabaseName = properties
     .getProperty("jdbc.importDatabaseName");
   // 导入的目标文件所在的位置
   String importPath = properties.getProperty("jdbc.importPath");
 
  // 第一步,获取登录命令语句
   String loginCommand = new StringBuffer().append("mysql -u")
     .append(username).append(" -p").append(password).append(" -h")
     .append(host).append(" -P").append(port).toString();
   // 第二步,获取切换数据库到目标数据库的命令语句
   String switchCommand = new StringBuffer("use ").append(
     importDatabaseName).toString();
   // 第三步,获取导入的命令语句
   String importCommand = new StringBuffer("source ").append(importPath)
     .toString();
   // 需要返回的命令语句数组
   String[] commands = new String[] { loginCommand, switchCommand,
     importCommand };
   return commands;
  }
 
 public static void main(String args[]) throws IOException {
   // jdbc.properties文件配置
   // jdbc.username=root
   // jdbc.password=123456
   // jdbc.host=localhost
   // jdbc.port=3306
   // jdbc.exportDatabaseName=school
   // jdbc.exportPath=f\:\\school.sql
   // jdbc.importDatabaseName=school
   // jdbc.importPath=f\:\\school.sql
 
  InputStream is = MySqlImportAndExport.class.getClassLoader()
     .getResourceAsStream("jdbc.properties");
   Properties properties = new Properties();
   properties.load(is);
   MySqlImportAndExport.export(properties);
   // MySqlImportAndExport.importSql(properties);
  }
 
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics