minimize

DAO機能

自作の簡易O/Rマッピングツールです。
Hibernateなどの有名どころを使ってもいいのですが、
どうも設定が面倒という印象が強いので使っていません。

機能的には当然こちらの方が見劣りするのですが
その代わり簡単だし処理も速いです。
Hibernate 3.1.3 と比べてみたところ、約3倍高速でした。
昔は10倍くらいの差があったんですけどね。
Hibernateも徐々に高速化しているようです。

準備するもの

CREATE TABLE文を記述したSQLファイルを用意して下さい。
全ての元となるのがこれです。

-- ユーザ情報
create table USER_PROFILE (
    USER_ID INT PRIMARY KEY AUTO_INCREMENT, -- ユーザID
    USER_NAME VARCHAR(80) NOT NULL, -- ユーザ名
    PASSWORD VARCHAR(80) NOT NULL, -- 管理パスワード
    ENABLE_LIST BOOL DEFAULT 1 NOT NULL, -- 一覧に表示するか
    EMAIL varchar(80), -- e-mailアドレス
    HOMEPAGE varchar(255), -- ホームページアドレス
    REGIST_DATE DATE -- ユーザ登録日付
);

-- カウンタ
create table COUNTER (
    ID INT PRIMARY KEY AUTO_INCREMENT, -- プライマリキー
    CATEGORY INT, -- カテゴリ番号
    COUNT INT, -- カテゴリ毎の連番
    TARGET_DATE DATE, -- 対象日付
    TARGET_TIMESTAMP TIMESTAMP, -- 登録タイムスタンプ(自動登録)
    CLIENT_ADDR VARCHAR(21), -- クライアントのIPアドレス
    CLIENT_REFERER VARCHAR(255), -- クライアントのリファラー
    CLIENT_AGENT VARCHAR(255) -- クライアントのユーザーAgent
);

こんな感じで。一つのファイル内に全てのCREATE TABLE文を記述します。
そしたら、これを元にDOファイル(Javaのクラス)を生成しましょう。
Antを使います。

<taskdef name="daocreater" classname="org.limy.admin.dao.DaoClassCreaterTask">
    <classpath>
        <pathelement location="${lib.dir}/limy-core.jar" /> 
    </classpath>
</taskdef>

<target name="dao-create">
    <daocreater inputCharset="EUC-JP" inputSqlfile="resources/create_table.sql"
        outputCharset="EUC-JP" 
        outputDir="src"
        headerTextFile="resources/java_header.txt"
        projectName="test-project"
        packageName="org.limy.resource.bean"
        authorString="Naoki Iwami (naoki@limy.org)"
    />
</target>

まず、taskdef でタスクを登録します。locationの中身は適宜変更して下さい。
次に、daocreater要素を記述してタスクを実行します。
各要素の詳細は以下の通りです。

これで、outputDir ディレクトリ以下にDOファイルが生成されます。
以降、CREATE TABLE文を修正したら再度Antタスクを実行するようにします。

使い方

さて、DOファイルができたら準備は完了です。
まず、DB接続を取得(DBに接続)します。
DriverManager を使う方法と、DataSource を使う方法があります。

DriverManagerを使う方法

Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "");
DBConnection dbConn = new NormalDBConnection(conn);

DataSourceを使う方法

Context ctx = new InitialContext();
DataSource dataSource = (DataSource)ctx.lookup("java:comp/env/jdbcNormal");
DBConnection dbConn = new NormalDBConnection(dataSource);

Tomcat上で使う場合などは、DataSourceを使った方が便利です。
以降、DBConnection をDB接続として使います。
DOクラスを使ったDBアクセスには、CommonDAOユーティリティを使います。
当然ですが、使用し終わった DBConnection は必ず close を呼び出して下さい。

DOクラスの独自パッケージ名指定

生成したDOクラスは、org.limy.resource.bean パッケージに配置すれば
何の初期化処理も行わずにCommonDAOクラスを使えます。
別のパッケージに置いた場合は、以下の処理を最初に一度呼び出しておく必要があります。

DaoMappingTool.setBasePackageName("my.package");

CommonDAO使用例

CommonDAOユーティリティクラスを使ってレコードの取得などを行います。

全レコード取得

List<? extends DBRecord> records = CommonDAO.getRecords(conn, "SELECT * FROM SAMPLE_TABLE", null);
SampleTable[] tables = records.toArray(new SampleTable[records.size()]);

条件を指定してレコード取得

CommonDAO.getRecords(conn, "SELECT * FROM SAMPLE_TABLE WHERE id=?",
  new BindValues(1));

CommonDAO.getRecords(conn, "SELECT * FROM SAMPLE_TABLE WHERE id=? and name=?",
  new BindValues(Integer.valueOf(2), "naoki"));

レコード登録

SampleTable rec = new SampleTable();
rec.setId(10);
...
CommonDAO.regist(conn, rec, SampleTable.INSERT_INDICES);

レコード更新

SampleTable rec = new SampleTable();
rec.setId(10);
...
CommonDAO.updateRecords(conn, rec,
  SampleTable.INSERT_INDICES, SampleTable.PRIMARY_INDICES);

レコード削除

SampleTable rec = new SampleTable();
rec.setId(10);
...
CommonDAO.deleteRecords(conn, rec, SampleTable.PRIMARY_INDICES);
[コメント(0)]
[PR] b b nEXN[jOb FXb Cvgb ]ETCgb SEOb ANZXb nEX[J[b ^ItBXb SEO΍b ҋZb sYSۃ[b vb b nCb AXNb ]Eb یb ev[gb ꗷsb b Ƌhb b zb ҋZb ŗmb Stb wb [VbNb }bT[Wb FXb Mb 365b AtBGCgb эb FXb z[y[Wb fCg[hb FXb COnb ^Cb oRNb nC@^J[b xXg nC ze [cb ob NNnnCb Hawaii hotelsb Hawaii Activitiesb bhhrb zm}\b
y^cЁup_CVtgvT[rXz nCnIvVicA[ibN}j - rWlXNXq - iq(1) - iq(2) - COze - ؍s
z[y[W쐬 - ^T[o[ - gуz[y[W - uO - ze \ - ^CVFA - B - nC@Rh~jA - o@ze - nC@sY - v[Pbg@ze