使用mybatis时如何从查询中更改值(null为空字符串)?

时间:2014-04-04 02:21:37

标签: map null mybatis ibatis typehandler

我正在做一个使用Spring 3.1.1和MyBatis3.0的项目。

我正在尝试将iBatis更改为MyBatis。但是,我正在努力使用resultmap。

使用iBatis时,我可以使用'nullValue'处理来自下面的查询中的值。

<resultMap class="java.util.HashMap" id="ChannelData">
        <result property="id"       javaType="java.lang.String"         column="CHANNEL_ID" nullValue=""/>
        <result property="code"         column="SELECTSCOPE"        nullValue="Television"/>
</resultMap>

问题是MyBatis中没有'nullValue'。此外,如果列为“null”,则mybatis永远不会填充该元素。例如。如果'SELECTSCOPE'为空,则会带来{id=aaa}。我需要一些像这样的数据 - &gt; {id=aaa, code=''}。无论如何要处理这个?

P.S。

我查询超过20列。其中一些需要“”当值为null时,其他人有自己的默认值一些字符串值。(如果我使用iBatis,'nullValue'是魔术关键字)我发现一些链接建议使用自定义类型处理程序,但使处理程序超过20可能是未来修复或维护混乱的原因。我需要一些简单的方法。

非常感谢:D

=============================================== =======================================

我找到了带来一些空值的方法。它需要一些配置。

  • 制作config.xml,其中应包含有关MyBatis配置DTD和设置的一些信息,如下所示
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL MAP Config 3.1//EN" 
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <settings>
      <setting name="callSettersOnNulls" value="true"/>
  </settings>
</configuration>

现在,我可以获得{id="aaa", code = null}。这是另外一个问题。如何设置查询的默认值?例如。如果'code'的值为null,那么我想把默认的String'default'。所以结果应该改变形式 {id="aaa", code=null}{id="aaa",code="default"}。有可能吗?

谢谢〜

2 个答案:

答案 0 :(得分:3)

我想我可以为自己建议一个答案。但不知何故感觉效率不高。 我创建了一个TypeHandlerClass,它实现了接口&#39; org.apache.ibatis.type.TypeHandler&#39;。 源代码如下。

public class EmptyStringIfNull implements TypeHandler<String> {

    @Override
    public String getResult(ResultSet rs, String columnName) throws SQLException {
        return (rs.getString(columnName) == null) ? "" : rs.getString(columnName); 
    }

    @Override
    public String getResult(ResultSet rs, int columnIndex) throws SQLException {
        return (rs.getString(columnIndex) == null) ? "" : rs.getString(columnIndex);
    }

    @Override
    public String getResult(CallableStatement cs, int columnIndex)
            throws SQLException {
        return (cs.getString(columnIndex) == null) ? "" : cs.getString(columnIndex);
    }

    @Override
    public void setParameter(PreparedStatement ps, int arg1, String str,
            JdbcType jdbcType) throws SQLException {
    }
}; 

所以我在resultMap元素&#39; typehandler&#39;中将它链接起来。看起来像:

    <resultMap type="map" id="channel">
        <result property="id"   column="CHANNEL_ID" typeHandler="StringHandler"/>
        <result property="code" column="SELECTSCOPE"    typeHandler="StringHandler"/>
</resultMap>

但我还有其他问题。我看到我可以在这个.java代码中加入一些defaultValue。但是resultMap有很多结果。如果每个结果都有自己的特定默认值,那么如何处理呢?

使用&#39; if else&#39;在java代码填充效率低下,因为其中一些不需要检查值,它们只需要检查是否为null。建议你聪明的解决方案:D Thanx

答案 1 :(得分:1)

确实,结果图的 nullValue 属性非常方便。

如果您将结果映射到自定义类型而不是 HashMap ,默认情况下 false callSettersOnNulls 设置将有助于相关属性有默认值:

public class ChannelData {
    private String id;
    private String code = "default";
}

虽然它可能非常繁琐,但您也可以使用 NVL / COALESCE 等函数编辑SQL查询以处理默认值:

SELECT channel_Id, NVL(selectScope, 'default') AS selectScope

您建议的typeHandler具有应用于处理类型的每一列的缺点,并且不允许指定满足需求的不同默认值。

可以通过实现结果处理程序(但非常详细的解决方案)来实现,这些解决方案将包含在相关属性上的 if-else (不要忘记自定义结果处理程序必须提供结果列表,如果它是必需的。)