MyBatisでEnumを使う
MyBatisでEnumを使うにはどうすればいいのか。
もちろんマニュアルに書いてあるが、まとめるとこうだ。
具体例をマニュアルから引用すると
<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つけた方がいい。つけないとうまく動かなかった。