MyBatis自定义类型转换器

需求场景:当数据库中保存'Y'/'N',而对应bean字段的值的类型为boolean,这是就需要我们自定义类型转换器,在Mybatis执行SQL得到结果时,通过自定义类型转换器将CHAR或者VARCHAR2类型转换为boolean类型,Java代码如下:

 
 
package com.mangocity.btms.dynamicfield.util;

import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import org.apache.log4j.Logger;

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

/**
 * @author afei
 * java中的boolean和jdbc中的char之间转换;true-Y;false-N
 */
public class mangoBooleanTypeHandler implements TypeHandler<Boolean> {
    private static final Logger logger = Logger.getLogger(mangoBooleanTypeHandler.class) ;

    /**
     * 用于定义在Mybatis设置参数时该如何把Java类型的参数转换为对应的数据库类型
     * @param preparedStatement 当前的PreparedStatement对象
     * @param i 当前参数的位置
     * @param b 当前参数的Java对象
     * @param jdbcType 当前参数的数据库类型
     * @throws SQLException
     */
    public void setParameter(PreparedStatement preparedStatement, int i, Boolean b, JdbcType jdbcType) throws SQLException {
        if(b.equals(Boolean.TRUE)){
            preparedStatement.setString(i,"Y");
        }else{
            preparedStatement.setString(i,"N");
        }
    }

    /**
     * 用于在Mybatis获取数据结果集时如何把数据库类型转换为对应的Java类型
     * @param resultSet 当前的结果集
     * @param columnName 当前的字段名称
     * @return 转换后的Java对象
     * @throws SQLException
     */
    public Boolean getResult(ResultSet resultSet, String columnName) throws SQLException {
        return tranferType(resultSet.getString(columnName)) ;
    }

    /**
     * 用于在Mybatis通过字段位置获取字段数据时把数据库类型转换为对应的Java类型
     * @param resultSet 当前的结果集
     * @param i 当前字段的位置
     * @return 转换后的Java对象
     * @throws SQLException
     */
    public Boolean getResult(ResultSet resultSet, int i) throws SQLException {
        return tranferType(  resultSet.getString(i) );
    }

    /**
     * 用于Mybatis在调用存储过程后把数据库类型的数据转换为对应的Java类型
     * @param callableStatement 当前的CallableStatement执行后的CallableStatement
     * @param columnIndex 当前输出参数的位置
     * @return
     * @throws SQLException
     */
    public Boolean getResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
        return tranferType(callableStatement.getString(columnIndex));
    }

    private Boolean tranferType(String s){
        if("Y".equalsIgnoreCase(s))
        {
            return Boolean.TRUE ;
        }else{
            return Boolean.FALSE;
        }
    }
}

然后,在Mapper文件中,给需要转换的字段指定该类型转换器mangoBooleanTypeHandler(mangoBooleanTypeHandler为typeAlias,在Mybatis配置文件中定义):

<resultMap id="customDynamicFieldValueType" type="dynamicFieldValueType">
        <result column="DYNAMIC_FIELD_ID"    property="dynamicFieldId" />
        <result column="DYNAMIC_FIELD_VALUE" property="dynamicFieldValue" />
        <result column="DYNAMIC_FIELD_LABEL" property="dynamicFieldLabel" />
        <result column="REQUIRED" property="required" typeHandler="mangoBooleanTypeHandler" />
</resultMap>



猜你喜欢

转载自blog.csdn.net/feelwing1314/article/details/24303943
今日推荐