【Java】 Java から、 DB作成 / 権限付与 / 外部SQLファイル文実行 を行う

開発環境

環境

 * OS : Win10
 * DB : MySQL
 * Java : Java1.8

事前条件

(1) ルート以外のユーザを事前に登録しておくこと
# ユーザ「user1」パスワード「password1」でユーザ作成
CREATE USER user1 IDENTIFIED BY 'password1';
CREATE USER user1@localhost IDENTIFIED BY 'password1';

# 登録されているユーザを確認
SELECT user, host FROM mysql.user;
(2) SQL文(CREATE TABLE、sample.ddl)を用意
 * ファイル内容は、下記「外部SQLファイル(sample.ddl)」を参照

サンプル

Java

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

import com.mysql.jdbc.MysqlErrorNumbers;

public class DbInitilizer {

  public static void main(String[] args) {
    try {
      System.out.println("Start");

      Class.forName("com.mysql.jdbc.Driver");

      Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/sampledb?useSSL=false", "root",
          "password");
      Statement statement = connection.createStatement();

      // [1] DB作成
      statement.execute("CREATE DATABASE sampledb_2016");
      System.out.println("Database created successfully...");

      // [2] 権限付与
      String sql = "GRANT EXECUTE,SELECT,SHOW VIEW,"
          + "ALTER,ALTER ROUTINE,CREATE,CREATE ROUTINE,CREATE TEMPORARY TABLES,CREATE VIEW,"
          + "DELETE,DROP,EVENT,INDEX,INSERT,REFERENCES,TRIGGER,UPDATE,LOCK TABLES "
          + "ON sampledb_2016.* TO user1@'%' IDENTIFIED BY 'password1'";
      statement.execute(sql);
      sql = "GRANT EXECUTE,SELECT,SHOW VIEW,"
          + "ALTER,ALTER ROUTINE,CREATE,CREATE ROUTINE,CREATE TEMPORARY TABLES,CREATE VIEW,"
          + "DELETE,DROP,EVENT,INDEX,INSERT,REFERENCES,TRIGGER,UPDATE,LOCK TABLES "
          + "ON sampledb_2016.* TO user1@'localhost' IDENTIFIED BY 'password1'";
      statement.execute(sql);
      System.out.println("Grant successfully...");
    } catch (SQLException ex) {
      if (MysqlErrorNumbers.ER_DB_CREATE_EXISTS == ex.getErrorCode()) {
        System.out.println("Database already exists...");
        return;
      }
      ex.printStackTrace();
    } catch (Exception ex) {
      ex.printStackTrace();
    }

    // [3] 外部ファイルのSQL文実行
    String[] cmd = new String[] { "mysql", "-u", "root", "-ppassword", "-h", "localhost", "sampledb_2016" };

    ProcessBuilder builder = new ProcessBuilder(cmd);
    builder.redirectInput(ProcessBuilder.Redirect.from(new File("etc/sample.ddl")));
    builder.redirectOutput(new File("etc/result.tsv"));

    try {
      Process process = builder.start();
      process.waitFor();
      System.out.println(builder.redirectInput());
    } catch (Exception ex) {
      ex.printStackTrace();
    } finally {
      System.out.println("Finished");
    }
  }
}

外部SQLファイル(sample.ddl

CREATE TABLE IF NOT EXISTS `employee` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `birth_date` date NOT NULL,
  `section_id` bigint(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='従業員';

ALTER TABLE employee AUTO_INCREMENT = 1;

■ 補足:存在しても処理を続けたい場合

 * 「IF NOT EXISTS 【DB名】」を付与する

CREATE DATABASE IF NOT EXISTS sampledb_2016;
http://www.dbonline.jp/mysql/database/index1.html


関連記事

MySQLにおけるユーザ / 権限に関するあれこれ

http://blogs.yahoo.co.jp/dk521123/36202945.html

外部ファイルからSQL文を一括で実行するには...

http://blogs.yahoo.co.jp/dk521123/36200381.html