无论是 MyBatis 在预处理语句中设置一个参数,还是从结果集中取出一个值时,类型处理器被用来将获取的值以合适的方式转换成 Java 类型。
下面这个表格描述了默认的类型处理器:
类型处理器 | Java 类型 | JDBC 类型 |
BooleanTypeHandler | Boolean,boolean | 任何兼容的布尔值 |
ByteTypeHandler | Byte,byte | 任何兼容的数字或字节类型 |
ShortTypeHandler | Short,short | 任何兼容的数字或短整型 |
IntegerTypeHandler | Integer,int | 任何兼容的数字和整型 |
LongTypeHandler | Long,long | 任何兼容的数字或长整型 |
FloatTypeHandler | Float,float | 任何兼容的数字或单精度浮点型 |
DoubleTypeHandler | Double,double | 任何兼容的数字或双精度浮点型 |
BigDecimalTypeHandler | BigDecimal | 任何兼容的数字或十进制小数类型 |
StringTypeHandler | String | CHAR 和 VARCHAR 类型 |
ClobTypeHandler | String | CLOB 和 LONGVARCHAR 类型 |
NStringTypeHandler | String | NVARCHAR 和 NCHAR 类型 |
NClobTypeHandler | String | NCLOB 类型 |
ByteArrayTypeHandler | byte[] | 任何兼容的字节流类型 |
BlobTypeHandler | byte[] | BLOB 和 LONGVARBINARY 类型 |
DateTypeHandler | Date(java.util) | TIMESTAMP 类型 |
DateOnlyTypeHandler | Date(java.util) | DATE 类型 |
TimeOnlyTypeHandler | Date(java.util) | TIME 类型 |
SqlTimestampTypeHandler | Timestamp(java.sql) | TIMESTAMP 类型 |
SqlDateTypeHandler | Date(java.sql) | DATE 类型 |
SqlTimeTypeHandler | Time(java.sql) | TIME 类型 |
ObjectTypeHandler | Any | 其他或未指定类型 |
EnumTypeHandler | Enumeration 类型 | VARCHAR-任何兼容的字符串类型,作为代码存储(而不是索引)。 |
你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。要这样做的话,简单实现 TypeHandler 接口(org.mybatis.type),然后映射新的类型处理器类到 Java 类型,还有可选的一个 JDBC 类型。例如:
a、ExampleTypeHandler.java
public class ExampleTypeHandler implements TypeHandler { public void setParameter(PreparedStatement ps, int i, Object parameter,JdbcType jdbcType) throws SQLException { ps.setString(i, (String) parameter); } public Object getResult(ResultSet rs, String columnName) throws SQLException { return rs.getString(columnName); } public Object getResult(CallableStatement cs, int columnIndex) throws SQLException { return cs.getString(columnIndex); } }
b、MapperConfig.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="database.properties"/> <!-- 定义自己的类型处理器 --> <typeHandlers> <typeHandler javaType="String" jdbcType="VARCHAR" handler="org.mybatis.example.ExampleTypeHandler"/> </typeHandlers> <!-- 忽略其他配置 --> </configuration>
使用这样的类型处理器将会覆盖已经存在的处理 Java 的 String 类型属性和 VARCHAR 参数及结果的类型处理器。要注意 MyBatis 不会审视数据库元信息来决定使用哪种类型,所以你必须在参数和结果映射中指定那是 VARCHAR 类型的字段,来绑定到正确的类型处理器上。这是因为 MyBatis 直到语句被执行都不知道数据类型的这个现实导致的。