2010年7月31日(土) 19:32 JST

HOME > SE的 > お手軽SQLプログラム (Java編)

お手軽SQLプログラム (Java編)

  • 2010年1月19日(火) 17:58 JST
  • 投稿者:
    hyahagi

前回の記事、「お手軽SQLプログラム (VBS編)」ではVBScriptでWindowsからDB2 for i をアクセスしましたが、この記事ではJavaで同じ事をやってみます。Javaなので、プラットフォーム(OS)に依存せず、LinuxやIBM i などの上でも同じプログラムが動くところがミソです。

Javaの標準APIであるJDBCを使用し、DB2 for i のデータを読み込んで表示させます。

.



Java言語について今更説明は不要でしょう。Javaの開発・実行環境はJDKとして多くのプラットフォームに提供されており、同じプログラム(クラスファイル)を異なるプラットフォーム上で実行することができます。実行環境だけ切り出したものがJREとして配布されていますが、コンパイルも可能なJDKが必要であればSunのDownloadサイトから入手できます。IBM製のJDKもあり、「IBM developer kits」から入手できます。細かい部分でSun版との差異があるようです。

IBM i ではJDKはOSに同梱されているので、通常はGO LICPGMからインストールできます。詳細はIBM i Information Centerの「IBM Developer Kit for Java」あたりをご覧ください。この記事ではすでにIBM i にJDKがインストール済みとします。最近ではWindowsで「Rational Developer for i」を使うのが良いのでしょうが、ここではテキストエディター+JDKでIBM i 上でJavaプログラムを作成してみます。

DB2 for i にアクセスするには、前述のJDBCが必要になります。IBM i ではJDBCや他のIBM i の資源を利用したり、開発を容易にしたりするクラス群をまとめて「IBM ToolBox for Java」という名前で提供しています。JTOpenというオープンソース版もあり、基本的に同等の機能を提供します。オープンソースであるJTOpenが新しい機能を積極的に取り込み、その成果がToolBox for Javaにフィードバックされます。

前置きが長くなりました。早速Javaプログラムを作ってみましょう。

下記のソースをIBM i の「/tmp/JDBC」ディレクトリーに「JDBC.java」というファイル名で作成します。PCで作成してIBM i のIFSにFTPやNetServerで送るか、あるいは直接5250画面からEDTFコマンドでコピペします。


  1 import java.io.*;
  2 import java.sql.*;
  3 import com.ibm.as400.access.*;
  4 
  5 public class JDBC {
  6 
  7   public static void main(String[] args) throws Exception{
  8 
  9     Connection conn = null;
 10 
 11     try {
 12       Class.forName("com.ibm.as400.access.AS400JDBCDriver");
 13       conn = DriverManager.getConnection("jdbc:as400:" + args[0] + ";extended metadata=true;trace=false;",
 14              args[1], args[2]);
 15     }
 16     catch (SQLException se) {
 17       System.out.println("! SQLException - " + se.getMessage());
 18       se.printStackTrace();
 19     }
 20     catch (Exception e) {
 21       System.out.println("! Exception - " + e.getMessage());
 22       e.printStackTrace();
 23     }
 24 
 25     try {
 26 
 27       Statement stmt = conn.createStatement();
 28       ResultSet rs = stmt.executeQuery("select * from ライブラリー名.TOKMSP where TKBANG between '01080' and '02030'");
 29 
 30       ResultSetMetaData rsmd = rs.getMetaData();
 31 
 32       for (int i = 1 ; i <= rsmd.getColumnCount() ; i++) {
 33         System.out.print(rsmd.getColumnLabel(i).trim().replaceAll(" ", ""));
 34         if (i < rsmd.getColumnCount()) System.out.print("\t");
 35       }
 36       System.out.println();
 37 
 38       while (rs.next()) {
 39         for (int j = 1 ; j <= rsmd.getColumnCount() ; j++) {
 40           System.out.print(rs.getString(j).trim());
 41           if (j < rsmd.getColumnCount()) System.out.print("\t");
 42         }
 43         System.out.println();
 44 
 45       }
 46       rs.close();
 47       stmt.close();
 48 
 49     } finally {}
 50   }
 51 }

開発・実行環境に使用したIBM i は前の記事と同じくV5R4です。

プログラムでは、13行目でDB2 for i へのコネクションを張り、28行目でSQLを実行、32行目のfor文はCOLHDGを、38行目のfor文はSQLの結果を標準出力に出力しています。 13行目ではCOLHDGを取得するために、「extended metadata=true」を指定しています。引数のチェックをしていないとか、25行目のtryをcatchしていないとか、手抜きしている部分がありますがあしからず。(^-^;;;

次の手順でIBM i 上でコンパイルします。


> CHGJOB CCSID(5035)
> qsh

(以下Qshellでの操作)

> cd /tmp/JDBC
> ls -la
  total: 12.648 megabytes
  drwxrwsrwx   2 XXXXXXX  0                  8192 Jan  4 14:45 .
  drwxrwsrwt  14 QSYS     0                 36864 Jan  4 13:12 ..
  -rw-rw-rw-   1 XXXXXXX  0                  1219 Jan  4 14:43 JDBC.java
  -rwxrwxrwx   1 XXXXXXX  0               4318170 Apr 26  2008 jt400.jar

> javac -classpath .:jt400.jar JDBC.java

jt400.jarはToolBox for Java、またはJTOpenのクラスです。ここではJTOpenから最新版をダウンロードして使用しています。

コンパイルでエラーが出なければ、実行してみましょう。


 > java -version
   java version "1.4.2"
   Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_19-b04)
   Classic VM (build 1.4, build JDK-1.4, native threads, jitc_de)
   $
 > java -cp .:jt400.jar JDBC IPアドレス ユーザーID パスワード
    得意先番号      得意先仮名      得意先漢字      住所1          住所2
    地区コード      郵便番号        電話番号        当月売上高      当年売上高
    前年売上高      売掛金残高      信用限度額      最終入金日      締め日コー
    ド
   01080   アイカワ コウクウK.K     相川広告K.K        東京都渋谷区         広
    尾3?9      02      150     03-368-6366     318000  1461700 2205800 29
   0000       2000000 880214  2
   01090   アイカワ デンキK.K     相川電機K.K        東京都北区          滝
    の川7?17    14      114     03-749-6271     877100  4731400 7135500 94
   0000       900000  880519  2
   01100   アイカワ ガツキテン      相川楽器店          東京都港区          虎
    ノ門3?21    22      105     03-922-1801     501300  2973300 4800100 59
   0000       1300000 880615  6
(中略)
   02020   アイカワ セイサクシヨ      相川製作所          東京都葛飾区         東
    立石2?21    21      124     03-735-9343     761300  4287700 6982800 21
   00000      2300000 880508  5
   02030   アイカワ ヤクヒンコウギヨウK.K       相川薬品工業K.K      東京都文京区
    仙石2?1         13      112     03-342-7188     1035500 6018600 93920
   00      1200000 1500000 880105  3
   $

SQLの実行結果がCOLHDGとともに画面に表示されます。

.

冒頭にも書きましたが、JavaプログラムはJava実行環境(JDK/JRE)があれば他のプラットフォームでも実行できます。IBM i 上でコンパイルしたJavaプログラム、JDBC.classをWindowsで実行してみましょう。

FTPまたはNetServerでJDBC.classとjt400.jarをWindowsの適当なディレクトリーにコピーします。そこでコマンド・プロンプトを開き、cdで現行ディレクトリーをそのディレクトリーにして実行します。


C:\Documents and Settings\Administrator\デスクトップ\JDBC>java -cp .;jt400.jar J
DBC IPアドレス ユーザーID パスワード
得意先番号      得意先仮名      得意先漢字      住所1  住所2  地区コード
郵便番号        電話番号        当月売上高      当年売上高      前年売上高
売掛金残高      信用限度額      最終入金日      締め日コード
01080   アイカワ コウクウK.K    相川広告K.K        東京都渋谷区         広尾3-
9          02      150     03-368-6366     318000  1461700 2205800 290000
2000000 880214  2
01090   アイカワ デンキK.K    相川電機K.K        東京都北区          滝の川7
-17        14      114     03-749-6271     877100  4731400 7135500 940000
900000  880519  2
(中略)
02010   アイカワ センタ-       相川センター         東京都江東区         新木場1
-4         23      136     03-512-9478     705200  4029900 6183600 2000000
2000000 880501  1
02020   アイカワ セイサクシヨ     相川製作所          東京都葛飾区         東立石2
-21        21      124     03-735-9343     761300  4287700 6982800 2100000
2300000 880508  5
02030   アイカワ ヤクヒンコウギヨウK.K      相川薬品工業K.K      東京都文京区   
仙石2-1          13      112     03-342-7188     1035500 6018600 9392000
1200000 1500000 880105  3

当然ながら同じ結果になります。なお、IBM i とWindowsではクラスパス(-cp)の区切り文字がそれぞれ「:」と「;」で異なることに注意してください。CScriptコマンド同様、結果を標準出力にリダイレクトすればExcelなどで開くことができます。

IBM i 環境でもQshell環境からリダイレクトすれば同様に結果をファイルにできます。


 > touch -C 943  結果 .txt
   $
 > java -cp .:jt400.jar JDBC IPアドレス ユーザーID パスワード >  結果 .txt
   $

※ 「 結果 .txt」の空白はシフト文字を表しています。

なお、RUNJVAコマンドで標準出力をファイルにリダイレクトするため、パラメーターのPROP((os400.stdout 'file:///tmp/JDBC/SQLresult.txt'))を指定すると、出力先ファイル「SQLresult.txt」にはEBCDICのデータが書 き出されるようです。「CPY OBJ('/tmp/JDBC/SQLresult.txt') TOOBJ('/tmp/JDBC/SQLresultASCII.txt') FROMCCSID(5035) TOCCSID(943) DTAFMT(*TEXT) REPLACE(*YES)」のようにコード変換すればシフトJIS(CCSID 943)に変換できます。

.

さて、JDBC編はいかがだったでしょうか。Javaの実行環境さえあれば、UNIX系やメインフレームなどの他のプラットフォームでも動く可能性は高いです。

ToolBox for JavaはJDBCの他にも有用な機能を数多く提供していますので、JavaからIBM i の資源・情報を活用したい場合は一度ご覧になると良いでしょう。また、Javaプログラムに機能を追加して、POIでExcel形式にしたり、iTextでPDFにしたりするのも面白いかもしれません。

ではまた(^-^)/

 


 

 ここに書かれている内容は私の所属する会社、組織とは関係ありません。 内容を誰かが保証する物ではありません。

トラックバック

このエントリのトラックバックURL:
http://www.iforum.ne.jp/trackback.php/20100119175824958
表示形式
コメント投稿

コメントは投稿者の責任においてなされるものであり,サイト管理者は責任を負いません。

iForumサポーター

      iFourmの趣旨にご賛同いただき、ご支援いただける企業または個人を募集しています。詳しくは、info@iforum.ne.jp へお願いします。