MyBatis 自定义一个 typeHandler 没有执行
MyBatis custom a typeHandler not executed
在3.2.8官方文档中,在'typeHandlers'部分,我测试了一下,发现无法覆盖默认的org.apache.ibatis.type.StringTypeHandler。我调试它,它在 StringTypeHandler 中停止,而不是 ExampleTypeHandler。
这是 mybatis-config.xml 文件:
<?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);
}
}
我假设您正在尝试覆盖 Varchar => String 默认类型处理程序
但是 the documentation you refers to 指定:
You can override the type handlers or create your own to deal with
unsupported or non-standard types.
Varchar <=> String 是 supported/standard 类型处理的最常见情况之一。
似乎Mybatis 不允许隐式覆盖(在配置中定义,然后是应用程序的全局)用户定义的类型处理程序在库中定义的类型处理程序。
那么您可能必须在 resultMap 中显式引用自定义结果处理程序:
<result property="name" column="Name" typeHandler="com.example.mybatis.type.handler.ExampleTypeHandler" />
或设置参数时:
#{name, typeHandler=com.example.mybatis.type.handler.ExampleTypeHandler}
编辑:经过进一步测试,事实证明无需在 resulMap 中显式声明即可调用 ExampleTypeHandler。罪魁祸首是应该删除的注释:
@MappedJdbcTypes(JdbcType.VARCHAR)
注释注释&运行/取消注释&运行,你会看到区别。
在3.2.8官方文档中,在'typeHandlers'部分,我测试了一下,发现无法覆盖默认的org.apache.ibatis.type.StringTypeHandler。我调试它,它在 StringTypeHandler 中停止,而不是 ExampleTypeHandler。 这是 mybatis-config.xml 文件:
<?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);
}
}
我假设您正在尝试覆盖 Varchar => String 默认类型处理程序 但是 the documentation you refers to 指定:
You can override the type handlers or create your own to deal with unsupported or non-standard types.
Varchar <=> String 是 supported/standard 类型处理的最常见情况之一。
似乎Mybatis 不允许隐式覆盖(在配置中定义,然后是应用程序的全局)用户定义的类型处理程序在库中定义的类型处理程序。
那么您可能必须在 resultMap 中显式引用自定义结果处理程序:
<result property="name" column="Name" typeHandler="com.example.mybatis.type.handler.ExampleTypeHandler" />
或设置参数时:
#{name, typeHandler=com.example.mybatis.type.handler.ExampleTypeHandler}
编辑:经过进一步测试,事实证明无需在 resulMap 中显式声明即可调用 ExampleTypeHandler。罪魁祸首是应该删除的注释:
@MappedJdbcTypes(JdbcType.VARCHAR)
注释注释&运行/取消注释&运行,你会看到区别。