您的位置:首页 > 其它

MyBatis自定义类型转换器

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

[html] view
plain copy

 





  

[java] view
plain copy

 





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配置文件中定义):

[html] view
plain copy

 





<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>  

 然后我们在Mybatis的配置文件中这样注册它:

Xml代码  


<typeHandlers>  
   <typeHandler handler="com.tiantian.mybatis.handler.mangoBooleanTypeHandler"/>  
</typeHandlers>  

 

参考:
https://my.oschina.net/kolbe/blog/508131 http://elim.iteye.com/blog/1847854


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: