2014-04-04 1195 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對有關物業來實現(不要忘了自定義的結果處理有如果需要養活結果列表)。

相關問題