記憶のくずかご

メモを書く 適当に書く まじめに書かない

MyBatisでEnumを使う

MyBatisでEnumを使うにはどうすればいいのか。
もちろんマニュアルに書いてあるが、まとめるとこうだ。

  1. resultMapでEnumを使うときはtypeHandlerを書く
  2. parameterでEnumを使うときはmybatis-config.xmlにhandlerを定義する

具体例をマニュアルから引用すると

<resultMap type="org.apache.ibatis.submitted.rounding.User" id="usermap2">
  <id column="id" property="id"/>
  <result column="name" property="name"/>
  <result column="funkyNumber" property="funkyNumber"/>
  <result column="roundingMode" property="roundingMode" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
</resultMap>

<!-- mybatis-config.xml -->
<typeHandlers>
  <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="java.math.RoundingMode"/>
</typeHandlers>

この方法、resultMapはいいけどparameterを使うときにわざわざmybatis-config.xmlにhandlerを定義するっていうのはめんどくさくないか。俺はめんどくさい。

なので、mybatis-config.xmlにhandlerを定義しなくて済む方法がないか探した。 結果、あったにはあったが正攻法じゃないっぽいので注意が必要。

要はtypeHandlerの代わりにordinalを使うってことだ。

つまり、これを

#{roundingMode}

<!-- mybatis-config.xml -->
<typeHandlers>
  <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="java.math.RoundingMode"/>
</typeHandlers>

こうする

#{roundingMode.ordinal}

ちなみにordinal()だとうまくいかない。 どうやら、#{}の中ではReflectionでフィールドを参照することができるらしい。

上の例ではEnumOrdinalTypeHandlerの場合だが、EnumTypeHandlerを使いたい場合はordinalを書かなくていい。型がEnumだとデフォルトでEnumTypeHandlerを使うから。

あと、parameterが1つだけでそれがEnumの場合は@Paramつけた方がいい。つけないとうまく動かなかった。