スポンサーリンク

【MyBatis】SQL EnumとJava Enumをマッピングする

スポンサーリンク

前提

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
タイトルとURLをコピーしました