利用Java進(jìn)行MySql數(shù)據(jù)庫的導(dǎo)入和導(dǎo)出
利用Java來進(jìn)行Mysql數(shù)據(jù)庫的導(dǎo)入和導(dǎo)出的總體思想是通過Java來調(diào)用命令窗口執(zhí)行相應(yīng)的命令。
MySql導(dǎo)出數(shù)據(jù)庫的命令如下:
- mysqldump -uusername -ppassword -hhost -Pport exportDatabaseName > exportPath
利用Java調(diào)用命令窗口執(zhí)行命令來進(jìn)行MySql導(dǎo)入數(shù)據(jù)庫一般分三步走:
第一步:登錄Mysql數(shù)據(jù)庫,在登錄數(shù)據(jù)庫的時(shí)候也可以指定登錄到哪個(gè)數(shù)據(jù)庫,如果指定了則可以跳過第二步;
第二步:切換數(shù)據(jù)庫到需要導(dǎo)入的目標(biāo)數(shù)據(jù)庫
第三步:利用命令開始導(dǎo)入
在進(jìn)行導(dǎo)出的時(shí)候,需要注意命令語句的運(yùn)行環(huán)境,如果已經(jīng)將mysql安裝路徑下的bin加入到
系統(tǒng)的path變量中,那么在導(dǎo)出的時(shí)候可以直接使用命令語句,否則,就需要在執(zhí)行命令語句的
時(shí)候加上命令所在位置的路徑,即mysql安裝路徑想的bin下的mysqldump命令。
基本代碼如下:
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.io.OutputStreamWriter;
- import java.util.Properties;
- /**
- * 在進(jìn)行導(dǎo)出的時(shí)候,需要注意命令語句的運(yùn)行環(huán)境,如果已經(jīng)將mysql安裝路徑下的bin加入到
- * 系統(tǒng)的path變量中,那么在導(dǎo)出的時(shí)候可以直接使用命令語句,否則,就需要在執(zhí)行命令語句的
- * 時(shí)候加上命令所在位置的路徑,即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);//這里簡(jiǎn)單點(diǎn)異常我就直接往上拋
- MySqlImportAndExport.importSql(properties);
- }
- /**
- * 根據(jù)屬性文件的配置導(dǎo)出指定位置的指定數(shù)據(jù)庫到指定位置
- * @param properties
- * @throws IOException
- */
- public static void export(Properties properties) throws IOException {
- Runtime runtime = Runtime.getRuntime();
- String command = getExportCommand(properties);
- runtime.exec(command);//這里簡(jiǎn)單一點(diǎn)異常我就直接往上拋
- }
- /**
- * 根據(jù)屬性文件的配置把指定位置的指定文件內(nèi)容導(dǎo)入到指定的數(shù)據(jù)庫中
- * 在命令窗口進(jìn)行mysql的數(shù)據(jù)庫導(dǎo)入一般分三步走:
- * 第一步是登到到mysql; mysql -uusername -ppassword -hhost -Pport -DdatabaseName;如果在登錄的時(shí)候指定了數(shù)據(jù)庫名則會(huì)
- * 直接轉(zhuǎn)向該數(shù)據(jù)庫,這樣就可以跳過第二步,直接第三步;
- * 第二步是切換到導(dǎo)入的目標(biāo)數(shù)據(jù)庫;use importDatabaseName;
- * 第三步是開始從目標(biāo)文件導(dǎo)入數(shù)據(jù)到目標(biāo)數(shù)據(jù)庫;source importPath;
- * @param properties
- * @throws IOException
- */
- public static void importSql(Properties properties) throws IOException {
- Runtime runtime = Runtime.getRuntime();
- //因?yàn)樵诿畲翱谶M(jìn)行mysql數(shù)據(jù)庫的導(dǎo)入一般分三步走,所以所執(zhí)行的命令將以字符串?dāng)?shù)組的形式出現(xiàn)
- String cmdarray[] = getImportCommand(properties);//根據(jù)屬性文件的配置獲取數(shù)據(jù)庫導(dǎo)入所需的命令,組成一個(gè)數(shù)組
- //runtime.exec(cmdarray);//這里也是簡(jiǎn)單的直接拋出異常
- Process process = runtime.exec(cmdarray[0]);
- //執(zhí)行了第一條命令以后已經(jīng)登錄到mysql了,所以之后就是利用mysql的命令窗口
- //進(jìn)程執(zhí)行后面的代碼
- OutputStream os = process.getOutputStream();
- OutputStreamWriter writer = new OutputStreamWriter(os);
- //命令1和命令2要放在一起執(zhí)行
- writer.write(cmdarray[1] + "\r\n" + cmdarray[2]);
- writer.flush();
- writer.close();
- os.close();
- }
- /**
- * 利用屬性文件提供的配置來拼裝命令語句
- * 在拼裝命令語句的時(shí)候有一點(diǎn)是需要注意的:一般我們?cè)诿畲翱谥苯邮褂妹顏?
- * 進(jìn)行導(dǎo)出的時(shí)候可以簡(jiǎn)單使用“>”來表示導(dǎo)出到什么地方,即mysqldump -uusername -ppassword databaseName > exportPath,
- * 但在Java中這樣寫是不行的,它需要你用-r明確的指出導(dǎo)出到什么地方,如:
- * 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");//需要導(dǎo)出的數(shù)據(jù)庫名
- String host = properties.getProperty("jdbc.host");//從哪個(gè)主機(jī)導(dǎo)出數(shù)據(jù)庫,如果沒有指定這個(gè)值,則默認(rèn)取localhost
- String port = properties.getProperty("jdbc.port");//使用的端口號(hào)
- String exportPath = properties.getProperty("jdbc.exportPath");//導(dǎo)出路徑
- //注意哪些地方要空格,哪些不要空格
- 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();
- }
- /**
- * 根據(jù)屬性文件的配置,分三步走獲取從目標(biāo)文件導(dǎo)入數(shù)據(jù)到目標(biāo)數(shù)據(jù)庫所需的命令
- * 如果在登錄的時(shí)候指定了數(shù)據(jù)庫名則會(huì)
- * 直接轉(zhuǎn)向該數(shù)據(jù)庫,這樣就可以跳過第二步,直接第三步;
- * @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");//導(dǎo)入的目標(biāo)數(shù)據(jù)庫所在的主機(jī)
- String port = properties.getProperty("jdbc.port");//使用的端口號(hào)
- String importDatabaseName = properties.getProperty("jdbc.importDatabaseName");//導(dǎo)入的目標(biāo)數(shù)據(jù)庫的名稱
- String importPath = properties.getProperty("jdbc.importPath");//導(dǎo)入的目標(biāo)文件所在的位置
- //第一步,獲取登錄命令語句
- String loginCommand = new StringBuffer().append("mysql -u").append(username).append(" -p").append(password).append(" -h").append(host)
- .append(" -P").append(port).toString();
- //第二步,獲取切換數(shù)據(jù)庫到目標(biāo)數(shù)據(jù)庫的命令語句
- String switchCommand = new StringBuffer("use ").append(importDatabaseName).toString();
- //第三步,獲取導(dǎo)入的命令語句
- String importCommand = new StringBuffer("source ").append(importPath).toString();
- //需要返回的命令語句數(shù)組
- 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
原文鏈接:http://haohaoxuexi.iteye.com/blog/1413830
【編輯推薦】
- Java堆內(nèi)存的10個(gè)要點(diǎn)
- Play!在云端:Java PaaS平臺(tái)入門
- JavaFX 2.0.3發(fā)布 帶來兩個(gè)全新文檔
- Java generic中通配符的幾點(diǎn)理解
- Java中泛型創(chuàng)建數(shù)組的總結(jié)