利用Java來進行Mysql數據庫的導入和導出的總體思想是通過Java來調用命令窗口執行相應的命令。
MySql導出數據庫的命令如下:
- mysqldump -uusername -ppassword -hhost -Pport exportDatabaseName > exportPath
利用Java調用命令窗口執行命令來進行MySql導入數據庫一般分三步走:
第一步:登錄Mysql數據庫,在登錄數據庫的時候也可以指定登錄到哪個數據庫,如果指定了則可以跳過第二步;
第二步:切換數據庫到需要導入的目標數據庫
第三步:利用命令開始導入
在進行導出的時候,需要注意命令語句的運行環境,如果已經將mysql安裝路徑下的bin加入到
系統的path變量中,那麼在導出的時候可以直接使用命令語句,否則,就需要在執行命令語句的
時候加上命令所在位置的路徑,即mysql安裝路徑想的bin下的mysqldump命令。
基本代碼如下:
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.io.OutputStreamWriter;
- import java.util.Properties;
- /**
- * 在進行導出的時候,需要注意命令語句的運行環境,如果已經將mysql安裝路徑下的bin加入到
- * 系統的path變量中,那麼在導出的時候可以直接使用命令語句,否則,就需要在執行命令語句的
- * 時候加上命令所在位置的路徑,即mysql安裝路徑想的bin下的mysqldump命令
- * @author andy
- *
- */
- public class MySqlImportAndExport {
- public static void main(String args[]) throws IOException {
- InputStream is = MySqlImportAndExport.class.getClassLoader().getResourceAsStream("jdbc.properties");
- Properties properties = new Properties();
- properties.load(is);
- // MySqlImportAndExport.export(properties);//這裡簡單點異常我就直接往上拋
- MySqlImportAndExport.importSql(properties);
- }
- /**
- * 根據屬性文件的配置導出指定位置的指定數據庫到指定位置
- * @param properties
- * @throws IOException
- */
- public static void export(Properties properties) throws IOException {
- Runtime runtime = Runtime.getRuntime();
- String command = getExportCommand(properties);
- runtime.exec(command);//這裡簡單一點異常我就直接往上拋
- }
- /**
- * 根據屬性文件的配置把指定位置的指定文件內容導入到指定的數據庫中
- * 在命令窗口進行mysql的數據庫導入一般分三步走:
- * 第一步是登到到mysql; mysql -uusername -ppassword -hhost -Pport -DdatabaseName;如果在登錄的時候指定了數據庫名則會
- * 直接轉向該數據庫,這樣就可以跳過第二步,直接第三步;
- * 第二步是切換到導入的目標數據庫;use importDatabaseName;
- * 第三步是開始從目標文件導入數據到目標數據庫;source importPath;
- * @param properties
- * @throws IOException
- */
- public static void importSql(Properties properties) throws IOException {
- Runtime runtime = Runtime.getRuntime();
- //因為在命令窗口進行mysql數據庫的導入一般分三步走,所以所執行的命令將以字符串數組的形式出現
- String cmdarray[] = getImportCommand(properties);//根據屬性文件的配置獲取數據庫導入所需的命令,組成一個數組
- //runtime.exec(cmdarray);//這裡也是簡單的直接拋出異常
- Process process = runtime.exec(cmdarray[0]);
- //執行了第一條命令以後已經登錄到mysql了,所以之後就是利用mysql的命令窗口
- //進程執行後面的代碼
- 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");//需要導出的數據庫名
- String host = properties.getProperty("jdbc.host");//從哪個主機導出數據庫,如果沒有指定這個值,則默認取localhost
- String port = properties.getProperty("jdbc.port");//使用的端口號
- String exportPath = 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);
- return command.toString();
- }
- /**
- * 根據屬性文件的配置,分三步走獲取從目標文件導入數據到目標數據庫所需的命令
- * 如果在登錄的時候指定了數據庫名則會
- * 直接轉向該數據庫,這樣就可以跳過第二步,直接第三步;
- * @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;
- }
- }
上述使用的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