需求场景:当数据库中保存'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>