この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
JavaアプリでORマッパーを使う
先日、ちょっとしたJavaアプリを作る必要があり、DBアクセス方法をどうしようか検討してました。 最初はPreparedStatementつかって自分でSQL組み立ててもいいかなあと思ってたんですが、 仕様を確認したらそこまで楽なDBアクセスでないのでNG. 次にSpring DataとかhibernateとかiBATISとかのORマッパーを使おうと思ってたんですが、 DBアクセスをしたいだけなのに依存ライブラリがいっぱいあったり設定ファイル用意したりして 面倒だったので、これもヤメました。
で、いろいろ探してみた結果、簡単につかえそうなiciqlというORマッパーがあったので、紹介します。 iciqlの特徴は以下のとおり。
- 単一のjarで提供される
- 設定ファイルなしで使える
- DBからモデル生成できるツール付き
xmlとかでいちいち設定ファイルを書かずにOKで、他に依存するjarもなく、すぐに使えます。
動作環境
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.9.4
- Java : 1.8.0_11
- DB : MySQL 5.6
iciqlを使ってみる
iciqlを使う準備
まずはテスト用に使うテーブルを用意します。適当なスキーマを用意したら、そこにbookテーブルを作成しましょう。
CREATE TABLE `book` (
`id` int(11) NOT NULL,
`title` varchar(254) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
次にここからiciqlをダウンロードしましょう。 解凍すると、中にiciqlのjarファイルがはいっているのでクラスパスに追加します。あとはMySQL用JDBCドライバも追加しておきます。 これでiciqlを使う準備は完了です。 ※eclipseとか使う人は適当にJavaプロジェクトでもつくって、そこのクラスパスに追加
モデル生成
DBとライブラリの用意ができたら、対象のテーブルに対応するモデルクラスを作成します。 手動で作成してもいいですが、iciqlにはDBのスキーマからモデルを自動生成するツールがあるので、それを使いましょう。 iciql.jarを下記のようにjavaコマンドで実行すれば、DBからモデルが自動生成されます。
% java -Xbootclasspath/a:<JDBCドライバのパス> -jar <iciql.jarのパス> -url jdbc:mysql://localhost:3306/<db名>
-user <ユーザー名> -package <生成するモデルのパッケージ> -folder <モデルクラスを出力するディレクトリのパス>
先ほどのbookテーブルは次のようなモデルとして出力されます。
package <指定したパッケージ>;
import com.iciql.Iciql.IQColumn;
import com.iciql.Iciql.IQIndex;
import com.iciql.Iciql.IQIndexes;
import com.iciql.Iciql.IQSchema;
import com.iciql.Iciql.IQTable;
import com.iciql.Iciql.IndexType;
import java.io.Serializable;
@IQTable(name="book")
public class Book implements Serializable {
private static final long serialVersionUID = 1L;
@IQColumn(primaryKey=true, nullable=false)
public Integer id;
@IQColumn(length=254, nullable=false)
public String title;
public Book() {
}
}
Dbオブジェクトを使用して接続の取得
iciqlではcom.iciql.Dbオブジェクトを使用してCRUD操作を実行します。 Db.openメソッドを使ってDBコネクションを取得します。
Db db = Db.open(<jdbc url>, <ユーザー名>, <パスワード>);
select
bookテーブルからデータを取得するには下記のようにします。
//タイトルを指定してselect
Book book = new Book();
List<Book> result= db.from(book)
.where(book.title).is("はじめてのJava").select();
なお、toSQL()を使えば実際にどういうSQLが発行されるのか事前に取得することができます。
insert/update/delete
更新系の処理も簡単に実行可能です。
Book b = new Book();
・
・
//登録
db.insert(b);
//更新
db.update(b);
//削除
db.delete(b);
マージ処理(idに値が設定されていればupdate、そうでなければinsert)も可能です。
Book b = new Book();
db.merge(b);
SQLを直接実行
任意のSQLを実行することもできます。
db.executeQuery(<select系SQL>);
db.executeUpdate(<更新系SQL>);
トランザクション
iciqlはトランザクション管理の機能は持っていないので、これは自分でやらなければいけません。 getConnection()を使えばjava.sql.Connectionが取得できるので、コミットやロールバックは適宜行いましょう。
// 自動コミットをOFF
db.setAutoSavePoint(false);
db.getConnection().setAutoCommit(false);
//コミット
db.getConnection().commit();
//ロールバック
db.getConnection().rollback();
まとめ
今回は設定ファイルレスで簡単に使えるORマッパー、iciqlを紹介しました。 スキーマからモデル自動生成もできますし、手軽に使えていいのではないでしょうか。
参考サイトなど
- 公式:http://iciql.com/
- iciqlで実現するSQL DSLとJDBCリファクタリング:http://qiita.com/k--kato/items/507e70561382a03e959b