前提
MyBatisにおいては以下のマッピングの実現方法が異なります
- SQL VARCHAR ⇔ Java Enum
- SQL Enum ⇔ Java Enum
今回は主に後者の方です
SQL Enum ⇔ Java Enumのマッピング
Kotlinなので少し見慣れないかもしれませんが,内容は同じです.実施すべきことはTableでenumとして定義した名前をそのままマッピングする場合に限っては,ただ単にfieldをcastするだけで良いです.
*SQL CREATE TYPE state AS ENUM('A', 'B', 'C', 'D'); CREATE TABLE hogeTable ( id serial NOT NULL, currentState state NOT NULL, PRIMARY KEY (id) ); data class Dao( val id: Int = Int.MIN_VALUE, val currentState: State, ){ enum class State{ A, B, C, D } } *Kotlin(Java) @Insert("insert into hogeTable (currentState) values (cast(#{currentState} as state))") @Options(keyProperty = "id", useGeneratedKeys = true) fun insert(dao: DAO): Boolean
どうやらSQLではenumはアンチパターンの可能性もあるようなので,使う機会は少ないかもしれません
SQL VARCHAR ⇔ Java Enum
この場合はまず単純な場合として以下があります.
- Enumの名前をそのままマッピングする→EnumTypeHandler
- EnumのOrdinalを用いてマッピングする→ EnumOrdinalTypeHandler
それぞれ必要なところでtypeHandlerとして指定します.予めxmlあるいはconfigurationで動的に追加する必要があります.
上記以外の場合については,CustomなTypeHandlerを作製して指定します.(また使う機会があれば記載します)
これらは公式にも記載されている通りです.
mybatis – MyBatis 3 | Configuration