Mybatis配置文件之元素解析
1. 概述
mybatis在预处理语句(PreparedStatement)中设置一个参数或者从结果集中(ResultSet)中取出一个值时,都会用注册了的typeHandler进行处理。
由于数据库厂商的不同,所以厂商设置的参数可能也不同,同时数据库也可以自定义数据类型,typeHandler允许我们根据项目的需要自定义设置Java传递到数据库的参数中,或者从数据库读取数据,我们也需要进行特殊的处理,这些都可以在在定义的typeHandler中进行处理,尤其是在使用枚举的时候我们常常需要使用typeHandler进行转换。
typeHandler与别名一样也分为mybatis系统定义的和用户自定义两种。通常情况下使用mybatis系统定义的就可以实现大部分功能,typeHandler常用的配置为Java类型(javaType)、JDBC类型(jdbcType)。typeHandler的作用是对参数或者结果进行两种类型的转换。
2. 系统定义typeHandler
mybatis系统内部定义了一系列的typeHandler,我们跟踪源代码可以看到,他们是在org.apache.ibatis.type.TypeHandlerRegistry中,如下:
public TypeHandlerRegistry() {
register(Boolean.class, new BooleanTypeHandler());
register(boolean.class, new BooleanTypeHandler());
register(JdbcType.BOOLEAN, new BooleanTypeHandler());
register(JdbcType.BIT, new BooleanTypeHandler());
register(Byte.class, new ByteTypeHandler());
register(byte.class, new ByteTypeHandler());
register(JdbcType.TINYINT, new ByteTypeHandler());
register(Short.class, new ShortTypeHandler());
register(short.class, new ShortTypeHandler());
register(JdbcType.SMALLINT, new ShortTypeHandler());
register(Integer.class, new IntegerTypeHandler());
register(int.class, new IntegerTypeHandler());
register(JdbcType.INTEGER, new IntegerTypeHandler());
register(Long.class, new LongTypeHandler());
register(long.class, new LongTypeHandler());
register(Float.class, new FloatTypeHandler());
register(float.class, new FloatTypeHandler());
register(JdbcType.FLOAT, new FloatTypeHandler());
register(Double.class, new DoubleTypeHandler());
register(double.class, new DoubleTypeHandler());
register(JdbcType.DOUBLE, new DoubleTypeHandler());
register(Reader.class, new ClobReaderTypeHandler());
register(String.class, new StringTypeHandler());
register(String.class, JdbcType.CHAR, new StringTypeHandler());
register(String.class, JdbcType.CLOB, new ClobTypeHandler());
register(String.class, JdbcType.VARCHAR, new StringTypeHandler());
register(String.class, JdbcType.LONGVARCHAR, new ClobTypeHandler());