Java コマンドライン引数を使いレコードを追加する。

前回のJavaプログラムの欠点は、SQL文がプログラム中で固定されているので、レコードを追加する度にSQL文を書き直し、再度コンパイルしなければならないことでした。

そこで今回はプログラムの実行時に、追加のSQL文を「動的」に作成する方法を説明します。SQL文を動的に作成するにはいくつか方法がありますが、まずはいちばん簡単なコマンドライン引数を使う方法を試してみましょう。


【1】PrefInsert2.java を新たに作成します。

*「\」はWindowsではエンマークのことです。

保存先 C:\java\sample100
ファイル名 PrefInsert2.java

import java.sql.*;

class PrefInsert2 {
  public static void main(String args[]) {
    if (args.length != 2) {
      System.out.println("使い方:java PrefInsert PREF_CD PREF_NAME");
      System.exit(1);
    }
    try {
      //JDBCドライバのロード
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
      //各設定
      String url = "jdbc:odbc:SampleDB030";
      String user = "";
      String pass = "";
      //データベースに接続
      Connection con = DriverManager.getConnection(url,user,pass);
      //ステートメントオブジェクトを作成
      Statement stmt = con.createStatement();

      //SQL文作成
      int prefCd = Integer.parseInt(args[0]);
      String prefName = args[1];
      String mySql = "insert into T01Prefecture values(" + prefCd + ", '" + prefName + "')";
      System.out.println();
      System.out.println("SQL:" + mySql);

      //SQL実行
      int num = stmt.executeUpdate(mySql);
      System.out.println(num + "件のレコードを追加しました。");
      //オブジェクトを解放
      stmt.close();
      con.close();

    } catch (NumberFormatException e) {
      System.out.println("値を整数型に変換できませんでした。");
      System.out.println("例外発生:" + e );
    } catch (Exception e) {
      System.out.println("例外発生:" + e );
    }
  }
}



【2】コマンドプロンプトを起動して、カレントディレクトリを sample100 に切り替えます。

java-334.gif


【3】javac PrefInsert2.java と入力し、コンパイルします。

java-351.gif


【4】とりあえず java PrefInsert2 100 まで入力します。コマンドプロンプトはそのままの状態で置いておきます。

java-353.gif

*コマンドプロンプトでは日本語が入力できませんので、少し工夫します。


【5】テキストエディタを開き グアム と入力します。

java-352.gif


【6】入力した文字をコピーします。

java-355.gif


【7】コマンドプロンプトに戻り、貼り付けます。

java-354.gif


【8】最終的に java PrefInsert2 100 グアム と入力したら、プログラムを実行します。

java-356.gif


【9】プログラムの実行結果が表示されました。

java-357.gif

*コマンドライン引数を使い、SQL文がプログラムの中で動的に組み立てられています。


【10】コマンドプロンプトから確認してみます。java PrefSelect と入力し、プログラムを実行します。

java-358.gif


【11】「100 グアム」が追加されています。

java-359.gif


【12】データベース SampleDB030.mdb のテーブル T01Prefecture を開いても確認することができます。

java-360.gif


【解説】

(1)プログラムの実行時に、クラス名の後に半角スペースで区切って、コマンドライン引数を書くと、値をString型の配列として取り込めます。

・プログラム実行の仕方
java PrefInsert2 100 グアム

・クラスの先頭部分
public static void main(String args[]) {
main()メソッドの仮引数の部分で値を受け取っています。コマンドライン引数から取り込んだ値は配列になります。配列名は args です。


(2)コマンドライン引数が正しくない時の処理の部分です。「配列の要素数が2ではない時」は使い方を表示して、プログラムを終了しています。

java-361.gif

if (args.length != 2) {
System.out.println("使い方:java PrefInsert PREF_CD PREF_NAME");
System.exit(1);
}


(3)コマンドライン引数は数字でも文字列として扱われますので、必要なら数値型に変換します。文字列を整数型に変換できるのが、IntegerクラスのparseInt()メソッドです。
int prefCd = Integer.parseInt(args[0]);


(4)PREF_NAMEは文字列のままでいいのでそのまま取り込んでいます。
String prefName = args[1];


(5)SQL文を組み立てている部分です。変数が実際の値に置き換わります。
String mySql = "insert into T01Prefecture values(" + prefCd + ", '" + prefName + "')";

・文字列は「"」ダブルクォーテーションで囲みます。
・SQL文内の文字列は「'」シングルクォーテーションで囲みます。
・変数やコントロールは「"」ダブルクォーテーションの外に出します。


(6)SQL文の組み立て方

最終的に組み立てたいSQL文です。
insert into T01Prefecture values(100, 'グアム')

全体を「"」(ダブルクォーテーション)で囲みます。
"insert into T01Prefecture values(100, 'グアム')"

値をコントロールや変数に置き換えます。
"insert into T01Prefecture values(prefCd, 'prefName')"

コントロールや変数の前後に半角空白を入れ切り離します。
"insert into T01Prefecture values( prefCd , ' prefName ')"

コントロールや変数以外の文字列部分を「"」(ダブルクォーテーション)で囲みます。
"insert into T01Prefecture values(" prefCd ", '" prefName "')"

コントロールや変数と文字列を「+」で結合します。
"insert into T01Prefecture values(" + prefCd + ", '" + prefName + "')"

変数mySqlに代入して1行のプログラムの終わりをあらわす「;」(セミコロン)を付けます。
String mySql = "insert into T01Prefecture values(" + prefCd + ", '" + prefName + "')";

これでプログラムの中でSQL文が動的に組み立てられるようになりました。

*SQLについてはAccess SQL初心者入門講座で詳しく解説しています。


(7)実はSQL文自体は文字列なので、数値に変換しないで、次のように書いても同じ結果になります。
String mySql = "insert into T01Prefecture values(" + args[0] + ", '" + args[1] + "')";

わざわざ数値に変換しているのは、「適正な値」が入力されているか、SQL文を組み立てる前にチェックするためです。値が間違っていたらSQL文も間違いになるからです。

・整数型の値が入るところに、文字が入力された場合
java-362.gif

・例外をキャッチして処理しているプログラム
catch (java.lang.NumberFormatException e) {
System.out.println("値を整数型に変換できませんでした。");
System.out.println("例外発生:" + e );
}

*例外については次回詳しく解説します。


スポンサードリンク

スポンサードリンク






Java初心者入門講座TOPへ