注册typeHandler

注册TypeHandler
建立了自己的TypeHandler之后就需要把它注册到Mybatis的配置文件中,让Mybatis能够识别并使用它。注册TypeHandler主要有两种方式,一种是通过在Mybatis配置文件中定义typeHandlers元素的子元素typeHandler来注册;另一种是通过在Mybatis配置文件中定义typeHandlers元素的子元素package来注册。使用typeHandler子元素注册时一次只能注册一个TypeHandler,而使用package子元素注册时,Mybatis会把指定包里面的所有TypeHandler都注册为TypeHandler。使用typeHandler子元素注册时我们需要通过它的handler属性来指明当前要注册的TypeHandler的全名称,这个属性是必须要的。另外还有两个附加属性可以指定,一个是javaType,用以指定对应的java类型;另一个是jdbcType,用以指定对应的jdbc类型。使用package子元素注册时需要我们通过它的name属性来指定要扫描的包,如果这个时候我们也需要指定对应TypeHandler的javaType和jdbcType的话就需要我们在TypeHandler类上使用注解来定义了。Mybatis注册TypeHandler最基本的方式就是建立一个javaType、jdbcType和TypeHandler的对应关系。在使用typeHandler子元素进行注册的时候,有三种类型的注册方式:
1.如果我们指定了javaType和jdbcType,那么Mybatis会注册一个对应javaType和jdbcType的TypeHandler。
2.如果我们只指定了javaType属性,那么这个时候又分两种情况:
(1)如果我们通过注解的形式在TypeHandler类上用@MappedJdbcTypes指定了对应的jdbcType,那么Mybatis会一一注册指定的javaType、jdbcType和TypeHandler的组合,也包括使用这种形式指定了jdbcType为null的情况。现假设我们有如下这样一个StringArrayTypeHandler:

配置文件

<typeHandlers>
        <typeHandler handler="com.xxx.typeHandler.TestStringTypeHandler" javaType="string" jdbcType="VARCHAR" />
    </typeHandlers>

实现typeHandler接口

package com.xxx.typeHandler;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.log4j.Logger;


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


/**
 * Created by chenjianan on 2016/11/10-17:00.
 * <p>
 * Describe:
 */
 @MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes({String.class})
public class TestStringTypeHandler extends BaseTypeHandler<String> {

    private Logger log= Logger.getLogger(TestStringTypeHandler.class);

    public void setNonNullParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException {

        log.info("使用我的TypeHandler");
        preparedStatement.setString(i, s);
    }

    public String getNullableResult(ResultSet resultSet, String s) throws SQLException {
        log.info("使用我的TypeHandler,ResultSet列名获取");
        return resultSet.getString(s);
    }

    public String getNullableResult(ResultSet resultSet, int i) throws SQLException {
        log.info("使用我的TypeHandler,ResultSet下标获取");
        return resultSet.getString(i);
    }

    public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        log.info("使用我的TypeHandler,callableStatement下标获取");
        return callableStatement.getString(i);
    }
}

自定义typeHandler的使用

方法一

<resultMap id="roleMap" type="role">
        <result jdbcType="VARCHAR" javaType="string" column="note" property="note" />
    </resultMap>

    <select id="typeHandlerTest" parameterType="string" resultMap="roleMap">
        SELECT note FROM role WHERE note=#{note}
    </select>

这里的 jdbcType="VARCHAR" javaType="string"  要和 配置文件的 javaType="string" jdbcType="VARCHAR"   一致

方法二

<resultMap id="roleMap" type="role">
        <result  column="note" property="note" typeHandler="com.plife.typeHandler.TestStringTypeHandler" />
    </resultMap>

    <select id="typeHandlerTest" parameterType="string" resultMap="roleMap">
        SELECT note FROM role WHERE note=#{note}
    </select>
这种方法 配置文件的 typeHandler不用配置

方法三

<select id="typeHandlerTest" parameterType="string" resultType="role">
        SELECT note FROM role WHERE note=#{note javaType=string,jdbcType=VARCHAR,typeHandler=com.plife.typeHandler.TestStringTypeHandler}
    </select>
这种方法 配置文件的 typeHandler不用配置