类型别名只是一个更短的Java类型名。它只和xml配置有关,并且仅仅是为了缩减冗余的全限定类名的输入量,例如:
使用这个配置,"Blog"现在可以在任何"domain.blog.Blog"可以出现的地方使用。
有许多内建的常用Java类型的别名,它们是大小写不敏感的,考虑到重载的名称问题,要注意对于原始类型的特殊处理。
Alias | Mapped Type |
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
P14:
无论何时MyBatis在PreparedStatement设置参数或从ResultSet检索一个值,TypeHandler总是以一种适合于这种Java类型的方式来检索到值。下面的表格描述了默认的TypeHandler。
Type Handler | Java Types | JDBC Types |
BooleanTypeHandler | Boolean, boolean | 兼容BOOLEAN的类型 |
ByteTypeHandler | Byte, byte | 兼容NUMERIC or BYTE的类型 |
ShortTypeHandler | Short, short | 兼容NUMERIC or SHORT INTEGER的类型 |
IntegerTypeHandler | Integer, int | 兼容NUMERIC or INTEGER的类型 |
LongTypeHandler | Long, long | 兼容NUMERIC or LONG INTEGER的类型 |
FloatTypeHandler | Float, float | 兼容NUMERIC or FLOAT的类型 |
DoubleTypeHandler | Double, double | 兼容NUMERIC or DOUBLE的类型 |
BigDecimalTypeHandler | BigDecimal | 兼容NUMERIC or DECIMAL的类型 |
StringTypeHandler | String | CHAR, VARCHAR |
ClobTypeHandler | String | CLOB, LONGVARCHAR |
NStringTypeHandler | String | NVARCHAR, NCHAR |
NClobTypeHandler | String | NCLOB |
ByteArrayTypeHandler | byte[] | 兼容字节流(byte stream type)的类型 |
BlobTypeHandler | byte[] | BLOB, LONGVARBINARY |
DateTypeHandler | Date (java.util) | TIMESTAMP |
DateOnlyTypeHandler | Date (java.util) | DATE |
TimeOnlyTypeHandler | Date (java.util) | TIME |
SqlTimestampTypeHandler | Timestamp (java.sql) | TIMESTAMP |
SqlDateTypeHadler | Date (java.sql) | DATE |
SqlTimeTypeHandler | Time (java.sql) | TIME |
ObjectTypeHandler | Any | 其它或未定义的 |
EnumTypeHandler | Enumeration Type | VARCHAR – 任何兼容字符串的类型, 当编码被存储时 (不是索引). |
P15:
你可以覆盖type handler或定制一个去处理不支持或非标准化的类型。为此,只要实现TypeHandler接口(org.mybatis.type)、映射TypeHandler实现类到一个Java类型(也可以是一个JDBC类型)就行了,例如:
使用这样一个TypeHandler会覆盖现存的Java字符串属性、varchar参数和结果的type handler。注意:MyBatis不会依据数据库元数据自省出类型,所以必须定义参数和结果映射中的类型是一个varchar字段才能钩住正确的type handler. 这是因为MyBatis不会感知到数据类型,除非语句被执行。
每当MyBatis创建结果对象的新实例时,它会使用一个ObjectFactory实例来达到此目的。默认的ObjectFactory只是用默认构造函数来初始化这个目标类,如果参数映射存在,就使用一个参数化的构造函数。如果想覆盖ObjectFactory的默认行为,可以自己创建一个。例如: