開発環境
環境
* 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
参考文献
DB作成http://stackoverflow.com/questions/717436/create-mysql-database-from-java
外部SQLファイル文実行
http://ja.stackoverflow.com/questions/20814/java%E3%81%8B%E3%82%89mysql%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97-%E7%B5%90%E6%9E%9C%E3%82%92%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E6%9B%B8%E3%81%8D%E5%87%BA%E3%81%97%E3%81%9F%E3%81%84