以前、このブログでも紹介したO/Rマッパーのiciqlについて、使い方や問題点がある程度わかったので書いておきます。
インストール
さきほどのリンクの通りです。
自動生成
JPAの場合、ネットビーンズからエンティティを自動生成できますがiciqlにも似たような機能があります。
本体のjarファイルを使って以下のようにコマンドをたたけばOKです。
1 2 3 |
java -Xbootclasspath/a JDBCドライバのパス -jar iciqlのjarファイルのパス -url jdbcのURL -user ユーザー -password パスワード |
具体的な引数は下記のようになります。
1 2 3 |
java -Xbootclasspath/a:C:\Users\ユーザー名\.m2\repository\mysql\mysql-connector-java\5.1.23\mysql-connector-java-5.1.23.jar -jar iciql-1.6.5.jar (←これはリポジトリから引っ張り出したり、公式サイトからダウンロードしてカレントディレクトリにおいたりしてます。) -url jdbc:mysql://ipアドレス:3306/db名 -user ユーザー名 -password パスワード |
ちなみにもっといろいろな引数を付けられるようです。
ただ、
- プロパティが全てpublicで出力される。
- プロパティの並びがバラバラ(後述する問題点で致命的になる。)
- プロパティの変数名がデータベースのカラムと一緒(スネークケースになる)
など使いにくい点が挙げられます。独自に自動生成プログラム書いたほうがいいかもです・・(汗)
注意点
簡単でいいんですが、いろいろと使いにくいところもありました。私が解決できていないだけかもしれませんが下記に列挙します。
特に日付がらみのものが多かったです。
Date型のインポート
java.util.Dateではなくjava.sql.Dateでないとエラーになります。
不正な値のレコード
もともと入っている日付のレコードに00-00-00 00:00:00などが入っていると取得時にエラーが発生します。
ちなみにエンティティを自動生成する場合、default value=”00-00-00 00:00:00″なんてアノテーションが付きますが、これもエラーになります。ついでにdefault Value=”CURRENT TIMESTAMP”も駄目です。
自動生成機能はあまりスペックが高くないかも・・・です。
executeQueryのselect文
executeQueryという直接sqlを実行できるメソッドがありますが、これで取得する場合、エンティティの順番をデータベースのカラムの順番と一緒にしておく必要があります。
どういうことかいうとテーブルのカラムが
id int
name varchar
age int
という順番で並んでおり、select id, name ,age from person・・・とsqlを実行する場合、エンティティが
1 2 3 4 5 6 7 8 |
@IQColumn(primaryKey=true, nullable=false) public Integer id; @IQColumn public Integer age; @IQColumn public String name; |
などと並んでいるとエラー(nameをintegerに変換できない・・)がでます。
この場合、
1 2 3 4 5 6 7 8 |
@IQColumn(primaryKey=true, nullable=false) public Integer id; @IQColumn public String name; @IQColumn public Integer age; |
と書かなくてはいけません。ちなみにselect * from ・・・などワイルドカードを使うのも駄目です。データベースのカラムの並びと統一してあげる必要があります。
これには正直驚きました。ひょっとしたらどこかで設定をいじれるのかもしれませんが・・・
時下のsqlではなく、通常のselectのメソッドを使う場合は問題ありません。
ただ簡単に使えることは間違ないですし、テストなんかもしやすいのでいい点を積極的に活用してあげましょう。
参考リンク
iciqlで実現するSQL DSLとJDBCリファクタリング