typeMappingMap
typeMappingMapとは?
JDBC型とプログラム型を関連付ける設定をするDBFluteプロパティ。
DBFlute-1.1.x以降は、DBFluteクライアントの dfprop配下の databaseInfoMap.dfprop の中の一つのプロパティとして統合されました。 (Java6版のDBFlute-1.0.xまでは、typeMappingMap.dfprop という独立ファイルでした)
主に JDBCタスク、Sql2Entityタスクから参照されます。
実は、裏技でDBデータ型とJDBC型を関連付けることもできます。
このプロパティは TwoEdgedSword 扱いです。厳重注意のもと 利用して下さい。
プロパティ
map型プロパティ で、JDBC型とプログラム型の関連を key-value 形式で定義します。
typeMappingMapの仕様 @databaseInfoMap.dfprop
; typeMappingMap = map:{
; [JDBC-type] = [program-type]
...
}
デフォルトのJDBC型とプログラム型のマッピング表を参考にしながら設定して下さい。
このプロパティは、本当にいざっっっ、てときに利用します。通常はデフォルトのままで利用して下さい。 このプロパティの設定内容によっては正常に動作しなくなる可能性もありますので、利用には細心の注意を払って下さい。
自動マッピング
NUMERIC型とDECIMAL型は、桁数や小数点の有無などを自由に選択できる型(であることが多い)です。これら型を全て一律 BigDecimal にするのではなく、桁数や小数点の有無の情報をもとに自動でマッピングする型を変えることができます。
プログラム型を指定する部分で $$AutoMapping$$ と指定します。
自動マッピングの指定 @databaseInfoMap.dfprop
; typeMappingMap = map:{
; NUMERIC = $$AutoMapping$$
; DECIMAL = $$AutoMapping$$
...
}
NUMERIC と DECIMAL については、セットアップデフォルトとして自動マッピングが付与 されます。
自動マッピングの仕様は以下の通りです。
- NUMERIC( 1 - 9 , 0)
- INTEGER
- NUMERIC(10 - 18 , 0)
- BIGINT
- NUMERIC(19 - 38 , 0)
- NUMERIC
- NUMERIC( 1 - 38 , 2)
- NUMERIC
- DECIMAL( 1 - 9 , 0)
- INTEGER
- DECIMAL(10 - 18 , 0)
- BIGINT
- DECIMAL(19 - 38 , 0)
- DECIMAL
- DECIMAL( 1 - 38 , 2)
- DECIMAL
DBデータ型とJDBC型のマッピング
$$[DBデータ型の名前]$$ に対してJDBC型を指定 することで、DBデータ型とJDBC型のマッピングができます。
主には、未サポートのDBデータ型を扱えるようにする場合に利用します。
typeMappingMapのDBデータ型マッピングの仕様 @databaseInfoMap.dfprop
; typeMappingMap = map:{
; $$[DB data type]$$ = [JDBC type]
...
}
e.g. CLOBをなぜかDATE型にマッピング @databaseInfoMap.dfprop
; typeMappingMap = map:{
; $$CLOB$$ = DATE
...
}
独自のJDBC型にマッピングすることもできます。存在しないJDBC型を指定された場合は、内部的にその新しい型を取り込んで認識できるようにします。 その場合は、新しいJDBC型のプログラム型へのマッピングも同時に指定します。
e.g. CLOBをKOLOB型(新しい型)にマッピング (KOLOB型のマッピングも設定) @databaseInfoMap.dfprop
; typeMappingMap = map:{
; $$CLOB$$ = KOLOB
; KOLOB = com.example.type.KorondeItai
...
}
このように、指定したDBデータ型を 完全に独自のプログラム型にマッピング することもできます。但し、独自のプログラム型に対応する独自の ValueType を別途 DBFluteConfig にて設定する必要があります。
カラム名でJDBC型をポイント指定
実は、"このカラム名だったらこのJDBC型" という設定もできます。
時分秒を含んだ日付型しかないDBMS(Oracleなど)の場合に、カラム名の規則でDATEとTIMESTAMPを使い分けたいときなどに使うと良いです。 (時分秒が不要なのにLocalDateTime型で取り扱うのは何かとやりづらいですからね)
カラム名でJDBC型を指定 @databaseInfoMap.dfprop
# point type mapping, table/column and JDBC type
; $$df:point$$ = map:{
; WHITE_TYPE_MAPPING_POINT = map:{
; suffix:_LONG_INTEGER = INTEGER
; POINT_DATETIME_DATE = DATE
}
# example for naming policy type
#; $$ALL$$ = map:{
# ; suffix:_DATE = DATE
# ; suffix:_DATETIME = TIMESTAMP
#}
}
- WHITE_TYPE_MAPPING_POINTという名前のテーブル
- そのテーブルの _LONG_INTEGER で終わるカラムはINTEGER型に (実際の型はLONGだとして)
- そのテーブルの POINT_DATETIME_DATEカラムはDATE型に (実際の型はTIMESTAMPだとして)
- $$ALL$$ で "すべてのテーブル" という条件にすることもできる
デフォルトはどうマッピングされる?
JDBC型とプログラム型のデフォルトのマッピング表です。
JDBC型とプログラム型のデフォルトのマッピング
--------------------------------------------------------
| JDBC Type | Java Native | CSharp Native |
| ------------------------------------------------------
| CHAR | java.lang.String | String |
| VARCHAR | java.lang.String | String |
| LONGVARCHAR | java.lang.String | String |
| NUMERIC | java.math.BigDecimal | decimal? |
| DECIMAL | java.math.BigDecimal | decimal? |
| TINYINT | java.lang.Integer | int? |
| SMALLINT | java.lang.Integer | int? |
| INTEGER | java.lang.Integer | int? |
| BIGINT | java.lang.Long | long? |
| REAL | java.math.BigDecimal | decimal? |
| FLOAT | java.math.BigDecimal | decimal? |
| DOUBLE | java.math.BigDecimal | decimal? |
| DATE | java.util.Date | DateTime? |
| TIME | java.sql.Time | DateTime? |
| TIMESTAMP | java.sql.Timestamp | DateTime? |
| BIT | java.lang.Boolean | bool? |
| BOOLEAN | java.lang.Boolean | bool? |
| BINARY | byte[] | byte[] |
| VARBINARY | byte[] | byte[] |
| LONGVARBINARY | byte[] | byte[] |
| ARRAY | *Unsupported | *Unsupported |
| UUID | java.util.UUID | *Unsupported |
--------------------------------------------------------