MyBatis重写TypeHandler使字段为null的返回指定默认值

项目中使用MyBatis查询数据库,数据库中一个字段的值有一部分是null,想给这些null值指定一个默认值。
实现的方式是重写TypeHandler:

@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
    String value = rs.getString(columnName);
    if (value == null) {
        return "姓名为空";
    }
    return value;
}

xml配置:

<resultMap id="userMap" type="mybatis.domain.Users">
    <id property="id" column="id"/>
    <result property="userName" column="user_name" typeHandler="mybatis.handler.MyStringTypeHandler"/>
    <result property="sex" column="sex"/>
</resultMap>

但是返回的字段仍然是null,跟踪下源码:

if (rs.wasNull()) {
    return null;
} else {
    return result;
}

原因是BaseTypeHandler中的这块代码影响的,rs.wasNull的值为true

如何才能使null值得字段返回指定的默认值呢?

阅读 5.1k
1 个回答

抽象类org.apache.ibatis.type.BaseTypeHandler的几个getResult()方法是public的, 你重新一下这几个方法不就好了吗?

举个例子:

  @Override
  public T getResult(ResultSet rs, String columnName) throws SQLException {
    T result;
    try {
      result = getNullableResult(rs, columnName);
    } catch (Exception e) {
      throw new ResultMapException("Error attempting to get column '" + columnName + "' from result set.  Cause: " + e, e);
    }
    return result;
  }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进