つかびーの技術日記

情報系修士卒のWeb系技術日記です。現在のフォーカス分野はアドテクです。

MyBatis Generatorで生成するクラス内のDateをCalendarに変更する

      2014/01/05

訂正 2014/1/5

コメントにて、tomoさんからよりスマートな方法を教えて頂きました。以下のようにgeneratorConfig.xmlを編集すれば、以降のCalendarPluginは不要です。

generatorConfig.xml

columnOverrideについてはこちらを参照。tableName=”%”となっているので、DATETIMEという名前の列を持っていないテーブルが存在する場合、警告が出てしまいます。ちゃんとやる場合はtableNameを正しく定義してあげる必要があるかと思います。この設定で自動生成を行うとBean内の型がDateからCalendarに変わりました。実際に使用(Insert, Select)して問題なさそうでした。

tomoさん、どうもありがとうございました。

本文

前回の記事でMyBatisでDateではなくCalendarを利用する方法を説明しました。独自のTypeHandlerを用意し、MyBatisにCalendar型の扱い方を示しました。

MyBatis用のクラスや設定ファイルを自力で作成する場合は、何も問題はありません。しかし、MyBatis Generatorを利用する場合は別です。MyBatis Generatorを利用する場合、DBのテーブルの列が日付型である場合、Java側ではDateになってしまいます。折角Generatorで自動生成しているのに、手動でDateからCalendarへ変更するという処理は行いたくありません・・・。

今回はこれを何とかして、MyBatis GeneratorでCalendarを利用できるようにします。

例によってPluginで対応

MyBatis Generatorの挙動をカスタマイズしたいときはPluginを利用します。

MyBatis Generator + Lombokを試したときと同様にPluginを作成します。

CalendarPlugin.java

generatorConfig.xml (contextタグ内に以下を追加)

これで実行するとDateがCalendarになります。

問題点

実際に利用してみると、生成されたJavaBean(DTO)に警告が・・・・

上記のクラス内にtopLevelClassという変数があります。これは内部にimportするクラスのセットを持っていますが、上記のchangeDateToCalendarメソッド内でそのセットを操作していません。正確には、そのセットにCalendarクラスは追加しましたが、Dateクラスは取り除いていません。

じゃあ取り除けばいいよね・・・と思ってもこれができない・・・!

セットは以下のメソッドで取得することができます。

しかし、残念ながらこのメソッドの戻り値はUnmodifiableなセットです。つまり変更できません。他にimportを取り除くためのメソッドなども無く、残念ながら上記の警告は回避できそうにありません。何かもっと良い方法などをご存知の方いらっしゃいましたら教えて頂きたいです。

そんな訳で、警告は出てしまいますが、一応使えるようにしてみました。以上です。

 - Java