LoginSignup
0
3

More than 5 years have passed since last update.

JDBCを使って任意のSQLを叩くツール

Last updated at Posted at 2016-12-27

※本記事の後半に修正したものが記載されています。

DB.java
import java.sql.*;

public class DB {
  public static void main(String[] args) throws Exception {
    if (args.length != 1 || "".equals(args[0].trim())) {
      System.err.println("Error: <SQL>");
      System.exit(1);
    }
    String sql = args[0];
    Connection conn = null;
    try {
      String url = "jdbc: ... ";
      conn = DriverManager.getConnection(url);
      Statement stat = conn.createStatement();
      ResultSet result = stat.executeQuery(sql);
      while (result.next()) {
        System.out.println(createRowString(result));
      }
    } finally {
      if (conn != null) conn.close();
    }
  }

  private static String createRowString(ResultSet result) {
    StringBuilder buf = new StringBuilder();
    for (int i=1 ;; i++) {
      try {
        String s = result.getString(i);
        buf.append(s);
        buf.append('\t');
      } catch(SQLException e) {
        break;
      }
    }
    return buf.toString();
  }
}

url は例えばJavaDB(Apache Derby)だと以下のような文字列。

jdbc:derby:/path/to/database/dir;create=true;user=<username>;password=<password>

これを使えば以下のようにSQLを実行できる。結果はタブ区切りで出力される。

$ javac -cp .:<その他必要なjarファイルパス> DB.java
$ java -cp .:<その他必要なjarファイルパス> DB "SELECT * FROM xxtable"
aaa  AAA  111
bbb  BBB  222
ccc  CCC  333

SELECT文で * を使って任意のカラムを出力する場合、いくつカラムが出るかわからないのでcreateRowString()なんてメソッド作って頑張ったけど、もっといい方法ないのかな・・・


2016/12/28追記
saka1029さんにカラム数取得方法をコメント貰ったのでちょっと編集。

2017/01/03編集
UPDATE文やDELETE文が実行できなかったのでできるようにした。

DB.java
import java.sql.*;

public class DB {
  private static final  String URL = ... ;
  public static void main(String[] args) throws Exception {
    if (args.length != 1 || "".equals(args[0].trim())) {
      System.err.println("Error: <SQL>");
      System.exit(1);
    }
    String sql = args[0].trim();
    Connection conn = null;
    try {
      conn = DriverManager.getConnection(URL);
      Statement stat = conn.createStatement();
      if (isSelectStatement(sql)) {
        doSelect(stat, sql);
      } else {
        doUpdate(stat, sql);
      }
    } finally {
      if (conn != null) conn.close();
    }
  }

  private static boolean isSelectStatement(String sql) {
    String type = sql.split(" ")[0].toLowerCase();
    return "select".equals(type);
  }

  private static void doSelect(Statement stat, String sql) throws Exception {
    ResultSet result = stat.executeQuery(sql);
    while (result.next()) {
      System.out.println(createRowString(result));
    }
  }

  private static void doUpdate(Statement stat, String sql) throws Exception {
    int rowCount = stat.executeUpdate(sql);
    System.out.println("rows = " + rowCount);
  }

  private static String createRowString(ResultSet result) throws SQLException {
    ResultSetMetaData metadata = result.getMetaData();
    int columnCount = metadata.getColumnCount();
    StringBuilder buf = new StringBuilder();
    for (int i=1 ; i<=columnCount ; i++) {
      String s = result.getString(i);
      buf.append(s);
      buf.append('\t');
    }
    return buf.toString().trim();
  }
}
0
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3