首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MyBatis自定义未执行的typeHandler

MyBatis自定义未执行的typeHandler
EN

Stack Overflow用户
提问于 2016-10-31 08:33:46
回答 1查看 5.7K关注 0票数 2

在3.2.8的正式文档中,在“typeHandlers”部分,我有一个测试,然后发现它不能覆盖默认的org.apache.ibatis.type.StringTypeHandler。我调试它,它是停止在StringTypeHandler,而不是ExampleTypeHandler。下面是mybati-config.xml文件:

代码语言:javascript
复制
<?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

代码语言:javascript
复制
@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);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-02 11:40:27

我假设您正在尝试重写Varchar =>字符串默认类型处理程序,但您所指的文档指定:

您可以重写类型处理程序或创建自己的来处理不受支持的或非标准类型的

<=>字符串是支持/标准类型处理的最常见情况之一。

似乎不允许用户定义的类型处理程序在库中定义的类型处理程序隐式覆盖(在配置中定义,然后是全局的)。

然后,您可能必须在resultMap中显式引用自定义结果处理程序:

代码语言:javascript
复制
<result property="name" column="Name" typeHandler="com.example.mybatis.type.handler.ExampleTypeHandler" />

或在设置参数时:

代码语言:javascript
复制
#{name, typeHandler=com.example.mybatis.type.handler.ExampleTypeHandler}

编辑:经过进一步的测试,可以在没有显式声明的情况下调用ExampleTypeHandler。罪魁祸首是应该删除的注释:

代码语言:javascript
复制
@MappedJdbcTypes(JdbcType.VARCHAR)

注释注释& run /撤销注释& run,您将看到不同之处。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40338771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档