※本記事の後半に修正したものが記載されています。
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();
}
}