转自:http://ccchhhlll1988-163-com.iteye.com/blog/1420149

TypeHandler是MyBatis config文件中可选的配置选项,其可以对实体属性类型和数据库列类型的转换过程进行干涉,在过程中添加某些可能需要的操作。 
1、自定义的typeHandler类需要实现typeHandler接口并且实现接口方法; 
2、配置文件添加<typeHandler>; 
3、在映射文件中的参数和结果添加类型说明,javaType和jdbcType。 
简单实例如下: 
类型控制类------ 

 

package com.chl.mybatis.typehandler;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;


/**
 * @author chl
 * 类型转换器
 * 实现TypeHandler接口
 * 需要强调的是:为了让类型控制器起作用,必须在mapper.xml中对参数和结果的类型进行显示表明。
 */
public class StringVarcharTypeHandler implements TypeHandler{

    @Override
    public Object getResult(ResultSet rs, String columnName) throws SQLException {
        // TODO Auto-generated method stub
        System.out.println("getResult(rs,columnName)");
        return rs.getString(columnName);
    }

    @Override
    public Object getResult(CallableStatement arg0, int arg1)
            throws SQLException {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void setParameter(PreparedStatement ps, int paraIndex, Object object,
            JdbcType jt) throws SQLException {
        // TODO Auto-generated method stub
        System.out.println("setParameter()");
        ps.setString(paraIndex, (String)object);
    }

}

 

配置文件中:

<?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="config.properties"></properties>
    <!-- 定义vo -->
    <typeAliases>
        <typeAlias alias="User" type="com.mybatis.test.vo.User" />
    </typeAliases>
    <!-- 类型处理器 -->
    <typeHandlers>
        <typeHandler javaType="String" jdbcType="VARCHAR"
            handler="com.chl.mybatis.typehandler.StringVarcharTypeHandler" />
    </typeHandlers>
    <!-- end define -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${driver}" />
                <property name="url" value="${url}" />
                <property name="username" value="${username}" />
                <property name="password" value="${password}" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="com/mybatis/test/maps/UserMapper.xml" />
    </mappers>
</configuration>

这里注意该控制类的位置:
标签的顺序大致是:

"(properties,settings,typeAliases,typeHandlers,objectFactory,objectWrapperFactory,plugins,environments,mappers)".

如果报类似的错误的话,就是因为标签位置放错了的原因。

映射文件中添加类型说明:

 

    <insert id="insertUser2" parameterType="User">
        insert into user
        (username, password)
        values
        (#{username, javaType=String, jdbcType=VARCHAR},
        #{password, javaType=String, jdbcType=VARCHAR});
    </insert>
    <!-- 实现结果中列于对象属性的对应关系,利用javaType和jdbcType表示类型关系,这样有助于TypeHandler的匹配使用 -->
    <resultMap id="userMap" type="User">
        <result property="username" column="username" javaType="String"    jdbcType="VARCHAR"></result>
        <result property="password" column="password" javaType="String" jdbcType="VARCHAR"></result>
    </resultMap>