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

标签 map null mybatis ibatis typehandler

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

我正在尝试将 iBatis 更改为 MyBatis。但是,我正在努力处理结果图。

使用 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=''} .有没有办法处理这个?

附言

我查询了 20 多列。当值为空时,其中一些需要“”,其他有自己的默认一些字符串值。(如果我使用 iBatis,'nullValue' 是魔术关键字)我发现一些链接建议使用自定义类型处理程序,但使处理程序超过 20可能会导致 future 的维修或维护困惑。我需要一些简单的方法。

非常感谢:D

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

我找到了带来一些空值的方法。它需要一些配置。
  • make config.xml,其中应该包含一些关于 MyBatis Config DTD 和 Settings 的信息,如下

  • <?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} .这是附加问题。如何设置查询的默认值?例如。如果“代码”的值为空,那么我想将默认字符串“默认”。所以结果应该改变形式{id="aaa", code=null}{id="aaa",code="default"} .是否可以?

    谢谢~

    最佳答案

    我想我可以为自己提出一个答案。但不知何故,它感觉效率不高。
    我做了一个实现接口(interface)'org.apache.ibatis.type.TypeHandler'的TypeHandlerClass。
    源代码如下。

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

    关于map - 使用mybatis时如何从查询中更改值(null为空字符串)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22852383/

    相关文章:

    mysql - 如何在mysql中使用 'select'中的 'case when then'?

    opencv - 从立体声对获取深度图?

    json - Asp.Net Web Api 中 HttpGet 和 HttpPost 的区别

    c++ - 调试 map 插入?

    ios - IOS 类型的空变量

    c# - C# 8.0 中调用方法前的感叹号是什么意思?

    java - 使用 myBatis 映射嵌套的 Oracle CURSOR (ResultSet)

    java - MyBatis/iBatis - 单独的 SQL Map 文件中的可重用 sql 片段?

    java - hashMap、List 和 Set 的数据结构

    c++ - 使用 std::map 时这些做法是否合适?