[JAVA] Ein Tool zum Schlagen von beliebigem SQL mit JDBC

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();
  }
}

In JavaDB (Apache Derby) ist url beispielsweise die folgende Zeichenfolge.

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

Sie können damit SQL wie folgt ausführen. Die Ergebnisse werden durch Tabulatoren getrennt ausgegeben.

$ javac -cp .:<Andere erforderliche JAR-Dateipfade> DB.java
$ java -cp .:<Andere erforderliche JAR-Dateipfade> DB "SELECT * FROM xxtable"
aaa  AAA  111
bbb  BBB  222
ccc  CCC  333

Bei der Ausgabe einer beliebigen Spalte mit * in der SELECT-Anweisung habe ich mein Bestes getan, um eine Methode namens createRowString () zu erstellen, da ich nicht weiß, wie viele Spalten angezeigt werden, aber ich frage mich, ob es einen besseren Weg gibt ...


28.12.2016 Nachtrag saka1029 hat kommentiert, wie die Anzahl der Spalten ermittelt wird, daher habe ich sie ein wenig bearbeitet.

2017/01/03 Bearbeiten Die Anweisungen UPDATE und DELETE konnten nicht ausgeführt werden, daher habe ich es möglich gemacht.

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();
  }
}

Recommended Posts

Ein Tool zum Schlagen von beliebigem SQL mit JDBC
[Java] [SQL Server] Stellen Sie mit JDBC für SQL Server eine Verbindung zum lokalen SQL Server 2017 her
Ich habe ein Diff-Tool für Java-Dateien erstellt
JAVA-Prozedur zum Laden von MySQL JDBC mit Eclipse
Erstellen Sie in Salesforce ein Tool zur Namensidentifizierung
[Für Anfänger] Verfahren zum Erstellen eines Controllers mithilfe von Schienen
Ich habe ein Check-Tool für das Release-Modul erstellt
Probieren Sie Easy Ramdom, ein PropertyBase-Testtool für Java
Verwenden der Datenbank (SQL Server 2014) aus einem Java-Programm 2018/01/04
Ein Memorandum zum Erstellen eines erweiterten Loggers mit org.slf4j.Logger