Java MyBatis自定义类型处理程序未执行
在3.2.8官方文档的“TypeHandler”部分,我做了一个测试,然后发现它不能覆盖默认的org.apache.ibatis.type.StringTypeHandler。我调试它,它是在StringTypeHandler中停止的,而不是ExampleTypeHandler。 以下是mybatis-config.xml文件:Java MyBatis自定义类型处理程序未执行,java,mybatis,Java,Mybatis,在3.2.8官方文档的“TypeHandler”部分,我做了一个测试,然后发现它不能覆盖默认的org.apache.ibatis.type.StringTypeHandler。我调试它,它是在StringTypeHandler中停止的,而不是ExampleTypeHandler。 以下是mybatis-config.xml文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUB
<?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>
下面是示例TypeHandler.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);
}
}
@MappedJdbcTypes(JdbcType.VARCHAR)
公共类ExampleTypeHandler扩展了BaseTypeHandler{
@凌驾
public void setNonNullParameter(PreparedStatement ps,int i,String参数,JdbcType JdbcType)引发SQLException{
ps.setString(i,参数);
}
@凌驾
公共字符串getNullableResult(ResultSet rs,String columnName)引发SQLException{
返回rs.getString(columnName);
}
@凌驾
公共字符串getNullableResult(ResultSet rs,int columnIndex)引发SQLException{
返回rs.getString(columnIndex);
}
@凌驾
公共字符串getNullableResult(CallableStatement cs,int columnIndex)引发SQLException{
返回cs.getString(columnIndex);
}
}
我假设您试图覆盖Varchar=>字符串默认类型处理程序
但规定:
您可以重写类型处理程序或创建自己的来处理
不支持或非标准类型
Varchar字符串是受支持/标准类型处理的最常见情况之一
Mybatis似乎不允许用户定义的类型处理程序对库中定义的类型处理程序进行隐式重写(在配置中定义,然后对应用程序进行全局重写)
然后,您可能必须在resultMap中显式引用自定义结果处理程序:
<result property="name" column="Name" typeHandler="com.example.mybatis.type.handler.ExampleTypeHandler" />
编辑:在进一步测试之后,结果表明可以调用ExampleTypeHandler,而无需在ResultMap中进行显式声明。罪魁祸首可能是应删除的注释:
@MappedJdbcTypes(JdbcType.VARCHAR)
注释注释&run/取消注释&run,您将看到区别。这是我们要为特定列设置处理程序的时候,但全局级别如何。就像我每次遇到VARCHAR数据类型时都要调用自定义处理程序一样。
@MappedJdbcTypes(JdbcType.VARCHAR)