问一下spring4.3.11 + mybatis 3.2 8 <TypeHandler>

Ask about spring4.3.11 + mybatis 3.2 8 <TypeHandler>

我有一个问题。英语不熟练,谢谢理解

我在 spring web mvc 环境下使用 mybatis 的 web 项目有问题。

问题是这样的。在 DB 建模中,标志值以 VARCHAR2 形式给出。在 VO.java 中,原始类型作为布尔值给出。但是,在 select 操作期间出现错误。

因此,当我创建 SqlSessionFactoryBean 时,我可以通过将 typeHandlers 传递给 属性.

来改进它

所以当我尝试编码时

YesNoBooleanTypeHandler.java

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

import javax.servlet.annotation.HandlesTypes;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;

@MappedJdbcTypes(value = JdbcType.VARCHAR)
@MappedTypes(Boolean.class)
public class YesNoBooleanTypeHandler extends BaseTypeHandler<Boolean> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbcType)
            throws SQLException {
        ps.setString(i, parameter ? "true" : "false");

    }

    @Override
    public Boolean getNullableResult(ResultSet rs, String columnName) throws SQLException {

        return rs.getString(columnName) != null && "true".equalsIgnoreCase(rs.getString(columnName));
    }

    @Override
    public Boolean getNullableResult(ResultSet rs, int columnIndex) throws SQLException {

        return rs.getString(columnIndex) != null && "true".equalsIgnoreCase(rs.getString(columnIndex));
    }

    @Override
    public Boolean getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {

        return cs.getString(columnIndex) != null && "true".equalsIgnoreCase(cs.getString(columnIndex));
    }

}

SqlSessionFactoryBean 设置。

<beans:bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <beans:property name="dataSource" ref="dataSource" />
    <beans:property name="mapperLocations" value="classpath:edu/kosta/kdc/mapper/*Mapper.xml" />
    <beans:property name="typeAliasesPackage" value="edu.kosta.kdc.model.dto" />
    <beans:property name="typeHandlers" value="edu.kosta.kdc.util.YesNoBooleanTypeHandler"/>
</beans:bean>

ResultMap 配置

 <result column="MEMBER_ISWITHDRAWAL" property="memberIsWithdrawal" typeHandler="edu.kosta.kdc.util.YesNoBooleanTypeHandler" />

我是这样设置的

然后

嵌套异常是java.lang.IllegalStateException:无法将类型'java.lang.String'的值转换为属性所需的类型'org.apache.ibatis.type.TypeHandler' 'typeHandlers [0]':没有匹配的编辑器或找到转化策略

我无法运行服务器出现错误...... 我需要你的建议。

问题是您在 SqlSessionFactoryBean 中指定的 typeHandlers 不正确。 typeHandlers 是一个 TypeHandler 数组,但您提供了一个 String 值。配置应该是这样的:

<beans:bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <beans:property name="dataSource" ref="dataSource" />
    <beans:property name="mapperLocations" value="classpath:edu/kosta/kdc/mapper/*Mapper.xml" />
    <beans:property name="typeAliasesPackage" value="edu.kosta.kdc.model.dto" />
    <beans:property name="typeHandlers">
            <array>
                <beans:bean class="edu.kosta.kdc.util.YesNoBooleanTypeHandler" />
            </array>
    </beans:property>
</beans:bean>

Spring 无法实例化 bean,因为它无法将字符串转换为 TypeHandler.