实现方式
- 在自定义的TypeHandler类中使用注解@MappedTypes和@MappedJdbcTypes;
- 在MyBatis-config.xml文件中,指定javaType和jdbcType对应关系并指定handler所对应的自定义类;
- 在MyBatis-config.xml文件中指定包名;
创建IStringTypeHandler
继承BaseTypeHandler或实现接口TypeHandler都行。添加。
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Logger;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.apache.ibatis.type.TypeHandler;
@MappedTypes(String.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class IStringTypeHandler implements TypeHandler<String>{
private Logger log=Logger.getLogger(IStringTypeHandler.class.getName());
// @Override
// public String getNullableResult(ResultSet arg0, String arg1)
// throws SQLException {
// log.info("自定义StringTypeHandler,ResultSet根据列名"+arg1);
// return arg0.getString(arg1);
// }
//
// @Override
// public String getNullableResult(ResultSet arg0, int arg1)
// throws SQLException {
// log.info("自定义StringTypeHandler,ResultSet根据下标"+arg1);
// return arg0.getString(arg1);
// }
//
// @Override
// public String getNullableResult(CallableStatement arg0, int arg1)
// throws SQLException {
// log.info("自定义StringTypeHandler,CallableStatement存储过程"+arg0);
// return arg0.getString(arg1);
// }
//
// @Override
// public void setNonNullParameter(PreparedStatement arg0, int arg1,
// String arg2, JdbcType arg3) throws SQLException {
// log.info("自定义StringTypeHandler");
//
// }
@Override
public String getResult(ResultSet arg0, String arg1) throws SQLException {
log.info("自定义StringTypeHandler,ResultSet根据列名"+arg1);
return arg0.getString(arg1);
}
@Override
public String getResult(ResultSet arg0, int arg1) throws SQLException {
log.info("自定义StringTypeHandler,ResultSet根据下标"+arg1);
return arg0.getString(arg1);
}
@Override
public String getResult(CallableStatement arg0, int arg1)
throws SQLException {
log.info("自定义StringTypeHandler,CallableStatement存储过程"+arg0);
return arg0.getString(arg1);
}
@Override
public void setParameter(PreparedStatement arg0, int arg1, String arg2,
JdbcType arg3) throws SQLException {
log.info("自定义StringTypeHandler");
arg0.setString(arg1, arg2);
}
}
定义typeHandlers
- 自定义javaType和jdbcType对应关系,并指定handler所对应的类
<typeHandlers>
<typeHandler handler="com.yan.typeHandler.IStringTypeHandler" javaType="String" jdbcType="VARCHAR"/>
</typeHandlers>
- 或指定包名
<typeHandlers>
<package name="com.yan.typeHandler"/>
</typeHandlers>
修改Mapper文件
针对<result>
标签,指定TypeHandler,以note属性为例:
<result column="note" property="note" typeHandler="com.yan.typeHandler.IStringTypeHandler" />
测试结果
或:
总结
三种方式可以兼容存在,也可以独立使用,而第一种这种方式比较特殊,它是针对全局的,也就是说,虽然没有指定roleName属性的TypeHandler所对应的类,它仍然使用自定义的IStringTypeHandler规则进行转换,以上第一种测试结果中就出现了未配置的rolename列。