如何在 iBatis 中 Return NULL 值?

How to Return NULL-values in iBatis?

假设我有一个 Oracle 数据库和这样的界面:

public interface DaoMapper {

  @Select({
      "SELECT col1, col2, col3",
        "FROM my_table" })
  List<Map<String, Object>> getUntyped();

}

如果我调用 getUntyped() 并且所有列都有一个值,则映射包含三个条目。但是,如果 col2NULL,则映射只有两个条目。在许多情况下,这不是问题,但在我们代码的通用部分中,我实际上想在该地图上调用 .values() 并想要一个包含三个条目的列表。任何条目都可以是 null(或空字符串,因为在 Oracle 中也是如此)。

实际上,我真正高兴的是这样的事情,其中​​每个外部列表由包含三个条目的列表组成:

  @Select({
      "SELECT col1, col2, col3",
        "FROM my_table" })
  List<List<Object>> getUntypedList();

但是,iBatis 告诉我这是一个不受支持的操作。

因此,我在这里问我如何告诉 iBatis 包含 NULL 或空字符串的列。

有一个配置属性 callSettersOnNulls默认为false(更多信息here); you need to set it to true, but it affects all the statements not only the one you need. Also note that different mybatis versions may exhibit some bugs in the area as you can check here;所以你必须检查你使用的mybatis版本

感谢 I noticed the example for type handlers 并从那里开始:

public class EmptyStringTypeHandler extends StringTypeHandler {

  @Override
  public String getResult(ResultSet rs, String columnName) throws SQLException {
    return unnulledString(super.getResult(rs, columnName));
  }

  @Override
  public String getResult(ResultSet rs, int columnIndex) throws SQLException {
    return unnulledString(super.getResult(rs, columnIndex));
  }

  @Override
  public String getResult(CallableStatement cs, int columnIndex) throws SQLException {
    return unnulledString(super.getResult(cs, columnIndex));
  }

  private String unnulledString(String value) {
    return StringUtils.defaultString(value, "");
  }

}

现在的界面是:

public interface DaoMapper {

  @Select({
      "SELECT col1, col2, col3",
        "FROM my_table" })
  @Results(value = {
      @Result(column = "col1", property = "col1", typeHandler = EmptyStringTypeHandler.class),
      @Result(column = "col2", property = "col2", typeHandler = EmptyStringTypeHandler.class),
      @Result(column = "col3", property = "col3", typeHandler = EmptyStringTypeHandler.class)
  })
  List<LinkedHashMap<String, ?>> getUntyped();

}

我应该补充一点,最大的优点是我可以在每条语句的每列中指定它。对于更通用的用途,最好在每个语句中指定它。也许在未来的某个版本中?