自作の簡易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要素を記述してタスクを実行します。
各要素の詳細は以下の通りです。
入力ファイルの文字セット
CREATE TABLE文を記述したSQLファイル
出力するJavaファイルの文字セット
DOファイルの出力先ソースディレクトリ
出力するDOファイルに先頭に付けるヘッダ文を記述したファイル
プロジェクト名
ヘッダファイルに ${project} という記述があった場合これに置き換えます。
出力するDOファイルが所属するJavaパッケージ名
DOファイルのJavadocに使用するauthor文
これで、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クラスは、org.limy.resource.bean パッケージに配置すれば
何の初期化処理も行わずにCommonDAOクラスを使えます。
別のパッケージに置いた場合は、以下の処理を最初に一度呼び出しておく必要があります。
DaoMappingTool.setBasePackageName("my.package");
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);
|
|