2014-04-04 26 views
4

我正在做一个使用Spring 3.1.1和MyBatis3.0的项目。如何在使用mybatis时从查询中更改值(null为空字符串)?

我正在尝试将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}。我需要这样的数据 - >{id=aaa, code=''}。无论如何处理这个?

P.S.

我查询了20多列。其中一些需要“”,当值为null时,其他人有自己的默认字符串值(如果我使用iBatis,'nullValue'是magic关键字)我发现一些链接建议使用自定义类型处理程序,但处理程序超过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"}。可能吗?

谢谢〜

+0

您应该使用“callSettersOnNulls”创建另一个答案并接受该答案。 – luboskrnac

回答

3

我想我可以为自己建议一个答案。但不知何故,它感觉效率不高。 我做了一个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 { 
    } 
}; 

所以我在resultMap的元素 '的类型处理器' 它看起来像这个链接:

<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。建议你的聪明解决方案:D Thanx

0

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

如果映射结果到自定义类型,而不是一个的HashMap,在callSettersOnNulls设置是由默认值将帮助,如果有关的属性有默认值:

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

虽然也可以非常单调乏味,您还可以使用以下函数编辑SQL查询以处理默认值:NVL/COALESCE

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

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

它可以通过实施结果处理器(但非常详细的解决方案),这将包括在的if-else对有关物业来实现(不要忘了自定义的结果处理有如果需要养活结果列表)。

相关问题