*

[Java, DBUtils]ApacheのDBUtilsを利用して、データベースにアクセスする。

公開日: : 最終更新日:2015/03/16 AS400, java, System i

手抜きがしたい

オブジェクト指向をする上で、o/r mapperが欲しくなります。
かなーり昔にJavaを触っているときに、何かないか探しました。

それ以来使っているのがこちらの”DBUtils”になります。

DBUtilsはApacheが提供しているJDBCによる操作を簡単に行うことが出来るライブラリです。
厳密にはo/r mapperでなくて、o/r mapperっぽく使える薄いJDBCラッパーだと思います。インテリセンス効かせられないし。
でも軽いし、中身が想像つくから使いやすいです。
ライセンスについてはApacheのライセンスだったかな。

インストール

いつもどおり、ダウンロードしてきて、jarを取り込むだけなのでざっくりと。

1.Apacheのサイト→DBUtilsからダウンロードします。

2.IDEならばjarを取り込みをします。IDEでなければ環境変数にjarに対してpathを通します。

3.ソース上でimportします。

ざっくり。

使い方

o/r mapperを探すような方々ならば、ソースを見た方がはやそうなのでソースを記述します。

大きく分けて配列で取得する方法と連想配列で取得する方法があります。
上三つのソースはOracle用です。

配列で取得する場合

import org.apache.commons.dbutils.*;
import org.apache.commons.dbutils.handlers.ArrayListHandler;

public class UsingDBUTILS{
    public void getDataByArray() throws SQLException{
        OracleDataSource ds = new OracleDataSource();
        ds.setURL("jdbc:oracle:thin:@192.168.0.999:1521:xe");
        ds.setUser("wannabe");
        ds.setPassword("wannabe");
        
        QueryRunner runner = new QueryRunner(ds);
        ResultSetHandler<List<Object[]>> rs = new ArrayListHandler();
        List<Object[]> results = runner.query("select * from foo", rs);
        
        for(Object[] objs: results){
            for(Object obj: objs){
                System.out.println(obj);
            }
        }
    }
}

こんな感じで、ArrayListHandlerを利用します。
こちらを実行すると、RDBの列をObjectの配列として格納した、コレクションを戻してくれます。
あとはforeachで処理すればそこそこ綺麗にソースがまとまりますね。

Mapで取得する場合

import org.apache.commons.dbutils.*;
import org.apache.commons.dbutils.handlers.MapListHandler;

public class UsingDBUTILS{
    public void getDataByMap() throws SQLException{
        OracleDataSource ds = new OracleDataSource();
        ds.setURL("jdbc:oracle:thin:@192.168.0.999:1521:xe");
        ds.setUser("wannabe");
        ds.setPassword("wannabe");

        QueryRunner runner = new QueryRunner(ds);
        ResultSetHandler<List<Map<String, Object>>> rs = new MapListHandler();
        List<Map<String, Object>> bar = runner.query("select * from bar", rs);
    }
}

連想配列で取得したい場合はこのようにMapListHandlerを利用します。

バインディングしたい場合

import org.apache.commons.dbutils.*;

public class UsingDBUTILS{
    public void useDbutils() throws SQLException{
        List<Object[]> params = new ArrayList<Object[]>();
        params.add(new Object[]{"1", "2", "3"});
        params.add(new Object[]{"3", "4", "5"});
        params.add(new Object[]{"1", "2", "3"});
        
        String sql = "insert into foo (bar1, bar2, bar3) values(?, ? ,?)";
        
        OracleDataSource ds = new OracleDataSource();
        ds.setURL("jdbc:oracle:thin:@192.168.0.999:1521:xe");
        ds.setUser("wannabe");
        ds.setPassword("wannabe");
        
        QueryRunner runner = new QueryRunner(ds);
        runner.batch(sql, params.toArray(new Object[0][]));
    }
}

QueryRunnerオブジェクトのbatchメソッドで配列を引き渡します。

AS400にDBUtilsを使いたい

import com.ibm.as400.access.*;
import com.ibm.as400.access.AS400;
import javax.sql.DataSource;
import org.apache.commons.dbutils.*;
import org.apache.commons.dbutils.handlers.MapListHandler;

public class UsingDBUTILS{
    public void testFunc5() throws SQLException{
        AS400JDBCDataSource datasource = new AS400JDBCDataSource();
//      PCから起動してAS400に接続させる場合は以下のようにしないとサインオン要求が出ます。    
//      AS400JDBCConnectionPoolDataSource datasource = new AS400JDBCConnectionPoolDataSource("192.168.0.999");
//      datasource.setUser("wannabe");
//      datasource.setPassword("wannabe");

        DataSource ds = datasource;
        String sql = "select * from FOOLIB.FOO";
        
        QueryRunner runner = new QueryRunner(datasource);
        ResultSetHandler<List<Map<String, Object>>> rs = new MapListHandler();
        List<Map<String, Object>> book = runner.query(sql, rs);
    }
}

まずAS400を利用していて、そんで開発にjavaを使っていて、更にDBUtilsを利用してもいいよ、っていう現場がレアケースに思えますが、一応。

注意点

いわゆるごりごり書くSQLを実行して、ResultSetの.next()を呼び出しからカーソルを移動して読み出すプログラムに比べるとオブジェクト生成の分だけオーバーヘッドが生じて遅くなります。
ためしに50000行のテーブルに対して、同等の処理(読み出して、標準出力)を行った場合ですが、
セッションの確立が出来て、クエリ実行部分から、全てのデータ出力までを計測したところ、大体
Windows(i7):200ミリ秒
Windows(i3):500ミリ秒
AS400(V7):5000ミリ秒
上記ぐらい異なりました。
綺麗にコーディングして保守性を高めるために採用するか、高速化の為に採用しないのか、一部高速化の部分だけルールを決めて採用するか、検討する必要性があります。

ちなみに私は一部高速化の部分だけの3番目を採択してます。

ad

関連記事

logo

[jt400, Java]レコードレベルアクセスの実現

到着順 AS400のファイルシステムですと、レコードを読み込んで、処理して、出力して、次のレコード

記事を読む

wannabenote

[java, NetBeans, AS400]NETBEANSで作成したjavaプロジェクトをAS400上で実行する。

概要 NetBeansでコンパイルしたものをそのままAS400に実行させます。 また、NetBe

記事を読む

logo

PCからAS400のコマンドを実行する方法

C#でAS400のRPGを呼んだりコマンドを実行する方法はこちら→C#でAS400のプログラムCal

記事を読む

logo

[jt400, Java]AS400のファイルを更新するためにREADした時にRecord Lockをかける

RPG3なんかだと更新用のファイルはREADの瞬間に自動でレコードロックがかかります。 で、それを

記事を読む

logo

[C#]AS400に対してODBC接続でトランザクションによりSQLを実行する。

データベースに対するトランザクション処理 と銘打ちましたが、要するに安全にinsert文などを実行

記事を読む

wannabenote

[jt400, java]AS400用のJavaをPCで実行したとき、終了しない理由

終了しない JavaでAS400をいじってると、たまに、終了しないんです。 プロセスが残ったまま

記事を読む

wannabenote

[Java, Oracle]NetBeansでojdbc6.jarに参照設定をし、JavaでOracleに接続する。

NetBeansでJavaでOracleに接続する そんなプログラムを作りたい。 というわけで作

記事を読む

logo

[C#]AS400のメンバーを指定してデータにアクセスする

◆前提条件◆ CliantAccessをインストールしている。 .NET Framework3.

記事を読む

logo

AS400のインターフェースファイル

AS400にODBC接続するときに、ライブラリ名一覧が欲しい場合があります。 さて、それでは、

記事を読む

cwbx.dll 参照の追加

[C#,AS400]C#でAS400のプログラムCallとコマンドの実行方法。

PCのプログラムからCall AS400のRPGPGMをPCから呼び出ししたいときがあります。

記事を読む

ad

Message

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

ad

  •  Auther;わなび

     「オープン系得意だよね? 俺のPCの調子悪いんだけど」という無茶振りから解き放たれゲームエンジニアに。
    C#とかUnityを扱います。
    Twitterフォロー大歓迎です。
    githubアカウント→wannabenote
  • follow us in feedly
PAGE TOP ↑