typeHandlers又叫类型处理器,它的作用就是用来完成javaType和jdbcType之间的转换。同样,MyBatis中的类型转换也有系统定义和自定义两种。
1、系统定义typeHandlers
常见的系统定义typeHandlers如下:
类型处理器 | 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 | 任意 | 其他或未指定类型 |
EnumTypeHandler | Enumeration 类型 | VARCHAR-任何兼容的字符串类型,作为代码存储(而不是索引)。 |
2、自定义typeHandlers
你可以重写类型处理器或创建自己的类型处理器来处理不支持的或者非标准的类型,需要实现TypeHandler接口(org.mybatis.type),然后映射新的类型处理器到Java类型,还有一个可选的jdbc类型。
// ExampleTypeHandler.java
public class ExampleTypeHandler implements TypeHandler {
// 设置sql中指定索引的参数,即将javaType转化为jdbcType
public void setParameter(PreparedStatement ps, int i, Object parameter,JdbcType jdbcType) throws SQLException {
ps.setString(i, (String) parameter);
}
// 根据列名称从结果集获取值,并将jdbcType转换成javaType
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);
}
}
// MapperConfig.xml
<!--类型处理器 -->
<typeHandlers>
<!-- 注册自定义handler,说明它作用的jdbcType和javaType -->
<typeHandler javaType="String" jdbcType="VARCHAR" handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>
// Mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="User">
<resultMap id="ResultMap" type="com.pojo.User">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<!-- 不使用MyDateHandler-->
<result column="creator_id" jdbcType="VARCHAR" property="creator_id" />
<!-- 使用ExampleTypeHandler-->
<result column="creator" typeHandler="org.mybatis.example.ExampleTypeHandler" property="creator" />
</resultMap>
以上就实现了自定义类型处理器的创建、配置以及使用。
注意:当没有自定义的类型处理器时,MyBatis会根据结果自动选择合适的handler进行转换。一般不需要字定义类型处理器,使用默认的就可以了。