Map 在使用mybatis时,如何将查询中的值(null改为空字符串)更改?

Map 在使用mybatis时,如何将查询中的值(null改为空字符串)更改?,map,null,mybatis,ibatis,typehandler,Map,Null,Mybatis,Ibatis,Typehandler,我正在做一个使用Spring3.1.1和MyBatis3.0的项目 我正试着把iBatis改成MyBatis。然而,我正在与resultmap进行斗争 当使用iBatis时,我可以使用“nullValue”处理来自如下查询的值 <resultMap class="java.util.HashMap" id="ChannelData"> <result property="id" javaType="java.lang.String"

我正在做一个使用Spring3.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>
现在,我可以得到
{id=“aaa”,code=null}
。这里还有一个问题。如何设置查询的默认值?例如若“code”的值为空,那个么我想将默认字符串设置为“default”。所以结果应该改变形式
{id=“aaa”,code=null}
{id=“aaa”,code=“default”}
。可能吗


谢谢~

我想我可以给自己一个答案。但不知何故,它感觉效率不高。 我制作了一个TypeHandlerClass,它实现了接口“org.apache.ibatis.type.TypeHandler”。 源代码如下

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 {
    }
}; 
公共类EmptyStringIfNull实现TypeHandler{
@凌驾
公共字符串getResult(ResultSet rs,String columnName)引发SQLException{
返回(rs.getString(columnName)==null)?“”:rs.getString(columnName);
}
@凌驾
公共字符串getResult(ResultSet rs,int columnIndex)引发SQLException{
返回(rs.getString(columnIndex)==null)?“”:rs.getString(columnIndex);
}
@凌驾
公共字符串getResult(CallableStatement cs,int columnIndex)
抛出SQLException{
返回(cs.getString(columnIndex)==null)?“”:cs.getString(columnIndex);
}
@凌驾
public void setParameter(PreparedStatement ps,int arg1,String str,
JdbcType(JdbcType)引发SQLException{
}
}; 
所以我在resultMap元素“typehandler”中链接了这个元素,它看起来像:

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

但我还有一个问题。我知道我可以在这个.java代码中添加一些defaultValue。但是resultMap有很多结果。如果每个结果都有自己的特定默认值,如何处理

在java代码中使用“if-else”会导致效率低下,因为其中一些代码不需要检查值,只需要检查null或not。建议你聪明的解决方案:D Thanx

事实上,结果映射的nullValue属性非常方便

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

public class ChannelData {
    private String id;
    private String code = "default";
}
尽管这可能非常繁琐,但您也可以编辑SQL查询,使用NVL/COALESCE等函数处理默认值:

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


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

您应该创建另一个带有“callSettersOnNulls”的答案,并接受它。
public class ChannelData {
    private String id;
    private String code = "default";
}
SELECT channel_Id, NVL(selectScope, 'default') AS selectScope