2

您将如何从 java 程序将 .sql 文件加载到 mysql 数据库中?我尝试从自包含的 jar 中提取 sql 资源文件,我尝试使用 processBuilder 来定位和运行外部 shell 命令。我已经尝试了所有方法,但似乎没有一个是正确的方法。

因此,要查看我遇到的问题,只需执行以下操作:

在任何数据库上做一个 mysqldump:mysqldump -uroot --routines myDB > ~/Desktop/myDB.sql

现在让我们尝试从 java/jdbc api 重新创建整个数据库。如何使用我们的 mydB.sql 文件正确且正确地做到这一点?

认为您创建了一个很好的 jdbc 语句来循环您的数据库文件可能会很好,但是当您确实获得这样的转储部分时,它会变得丑陋和笨拙

问题一将遇到以下示例:

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `DOG`
--

DROP TABLE IF EXISTS `DOG`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `DOG` (
  `DOG_ID` mediumint(9) NOT NULL,
  `OWNER_ID` mediumint(9) NOT NULL,
  PRIMARY KEY (`DOG_ID`),
  KEY `CHANNEL_FK1` (`OWNER_ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

这是jdbc的限制吗?是否有一些我缺少的不错的 api,我可以像 mysql.createDatabase(myDB.sql) 一样调用它们。

4

4 回答 4

0
  1. 确保 mysql 连接器在您的类路径中,例如 java -cp mysql-connector-java-5.1.13-bin.jar 或者如果您使用 ant 或 NetBeans 构建项目,请确保 mysql 连接器作为库,这样当你构建你的项目时, java -jar YourApplication.jar 应该找到 lib/mysql-connector-java-5.1.13-bin.jar 或者什么。
  2. 在您的源代码中,加载驱动程序: Class.forName("com.mysql.jdbc.Driver").newInstance();
  3. 加载您的 .sql 文件: String sql = new Scanner(new File("yourfile.sql")).useDelimiter("\Z").next();
  4. 连接到您的数据库: Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database",username,password);
  5. 执行你的 sql:Statement st = conn.createStatement();st.execute(sql);

以上假设您的 .sql 文件包含 SQL 语句。

于 2012-04-13T14:52:22.630 回答
0

如果它不能通过 JDBC 工作,那么我推荐这个。

通常我将 ANT 用于此类任务(如执行 mysql 转储文件):

<exec command="mysql -u ${db.user} --password=${db.password} 
                     --database=${db.name}">
    <redirector input="${sql.file}"/>
</exec>

基本上,您可以从您的代码中构造和调用 ant 任务(如果您将必要的 ant 依赖项添加到您的类。

于 2012-04-13T14:40:06.457 回答
0

我不确定它是最好的方法,但它在我需要在运行时创建数据库的类似情况下对我有用:

首先定义以下变量:

private static final String BASE_MYSQL_COMMAND_LINE_STR = "mysql -uUSER -pPASSWORD -h localhost < ";

请将“USER”和“PASSWORD”替换为真实的用户名和密码,或者如果您不想对其进行硬编码,请动态构建字符串。只是在 -u、-p 和实际值之间没有空格。

还定义以下函数:

private static void executeCommandInLinuxShell(String command) throws Exception {
            String[] cmd = {"/bin/sh", "-c", command};  
            Process proc = Runtime.getRuntime().exec(cmd);
            BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            String line;
            while ((line = bufferedreader.readLine()) != null);
            bufferedreader.close();
            proc.waitFor();

    }

然后,假设在您的程序中有一个指向“mydB.sql”数据库文件的文件对象“sqlFile”:

String scmd = BASE_MYSQL_COMMAND_LINE_STR + sqlFile.getAbsolutePath();
executeCommandInLinuxShell(scmd);
于 2012-04-13T15:36:40.067 回答
0

Flyway具有高级 SQL 解析器,可以开箱即用地处理 mysql 转储。为您的用例配置它应该是微不足道的。

于 2012-04-21T18:30:17.597 回答