[JAVA] Un outil pour frapper du SQL arbitraire en utilisant 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();
  }
}

Par exemple, JavaDB (Apache Derby) a la chaîne de caractères suivante pour l'url.

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

Vous pouvez l'utiliser pour exécuter SQL comme suit. Les résultats sont délimités par des tabulations.

$ javac -cp .:<Autres chemins de fichiers JAR requis> DB.java
$ java -cp .:<Autres chemins de fichiers JAR requis> DB "SELECT * FROM xxtable"
aaa  AAA  111
bbb  BBB  222
ccc  CCC  333

Lors de la sortie d'une colonne arbitraire en utilisant * dans l'instruction SELECT, j'ai fait de mon mieux pour créer une méthode appelée createRowString () car je ne sais pas combien de colonnes vont apparaître, mais je me demande s'il existe un meilleur moyen ...


2016/12/28 postscript saka1029 a commenté comment obtenir le nombre de colonnes, alors je l'ai un peu modifié.

2017/01/03 Modifier Les instructions UPDATE et DELETE n'ont pas pu être exécutées, j'ai donc rendu cela possible.

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

Un outil pour frapper du SQL arbitraire en utilisant JDBC
[Java] [SQL Server] Se connecter à SQL Server 2017 local à l'aide de JDBC pour SQL Server
J'ai créé un outil Diff pour les fichiers Java
Procédure JAVA pour le chargement de MySQL JDBC à l'aide d'Eclipse
Créer un outil pour l'identification des noms dans Salesforce
[Pour les débutants] Procédure de création d'un contrôleur à l'aide de rails
J'ai créé un outil de vérification pour le module de version
Essayez Easy Ramdom, un outil de test PropertyBase pour Java
Utilisation de la base de données (SQL Server 2014) à partir d'un programme Java 04/01/2018
Un mémorandum pour créer un enregistreur étendu à l'aide de org.slf4j.Logger