前提
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 3 | Configuration – mybatis
