2016-10-31 37 views
1

在3.2.8官方文檔中,在'typeHandlers'部分,我有一個測試,然後發現它不能覆蓋默認的org.apache.ibatis.type.StringTypeHandler。我調試它,它停在StringTypeHandler,而不是ExampleTypeHandler。 這裏是MyBatis的-config.xml文件:MyBatis自定義一個typeHandler不執行

<?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="db.properties"/> 

    <settings> 
     <setting name="mapUnderscoreToCamelCase" value="true"/> 
    </settings> 

    <typeAliases> 
     <package name="com.solverpeng.mybatis.beans"/> 
    </typeAliases> 

    <typeHandlers> 
     <typeHandler handler="com.solverpeng.mybatis.typeHandlers.ExampleTypeHandler"/> 
    </typeHandlers> 

    <environments default="development"> 
     <environment id="development"> 
      <transactionManager type="JDBC"/> 
      <dataSource type="POOLED"> 
       <property name="driver" value="${jdbc.driver}"/> 
       <property name="url" value="${jdbc.url}"/> 
       <property name="username" value="${jdbc.username}"/> 
       <property name="password" value="${jdbc.password}"/> 
      </dataSource> 
     </environment> 
    </environments> 
    <mappers> 
     <mapper resource="com/solverpeng/mybatis/beans/mapper/CustomerMapper.xml"/> 
    </mappers> 
</configuration> 

這裏是ExampleTypeHandler.java

@MappedJdbcTypes(JdbcType.VARCHAR) 
public class ExampleTypeHandler extends BaseTypeHandler<String> { 

    @Override 
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { 
     ps.setString(i, parameter); 
    } 

    @Override 
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException { 
     return rs.getString(columnName); 
    } 

    @Override 
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException { 
     return rs.getString(columnIndex); 
    } 

    @Override 
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { 
     return cs.getString(columnIndex); 
    } 
} 

回答

1

我假設你正在試圖覆蓋將varchar =>字符串默認類型處理器 但the documentation you refers to指定:

您可以覆蓋類型處理程序或創建自己的來處理 不支持或非標準類型

varchar < =>字符串是支持/標準類型處理最常見的情況之一。

看來 Mybatis不允許在用戶定義的類型處理程序中定義的lib中定義類型處理函數的隱式覆蓋(在配置中定義,然後在應用程序中定義)。

那麼你可能必須明確地引用自定義結果處理的結果映射:

<result property="name" column="Name" typeHandler="com.example.mybatis.type.handler.ExampleTypeHandler" /> 

或設置參數時:

#{name, typeHandler=com.example.mybatis.type.handler.ExampleTypeHandler} 

編輯:經過進一步測試,事實證明,在ExampleTypeHandler可以在resulMap中沒有顯式聲明的情況下調用。罪魁禍首是應刪除註釋:

@MappedJdbcTypes(JdbcType.VARCHAR) 

評論註解&運行/取消註釋&來看,你會看到其中的差別。