直接入主题:

一个mybatis的Mapper文件

xxxxMapper(Map<String,Object>params);

相关xml代码片段:

<if test="packageType!= null and packageType!= '' or packageType == 0">
        and package_type = #{packageType,jdbcType=TINYINT}
      </if>

service端部分代码:

Map<String,Object>params = new HashMap<>();

params.put("packageType","");

最初的设想,前端页面传入packageType条件为空字符串时,不把packageType作为过滤条件,但是上面的代码却达不到效果,下面从源码入手分析下为什么产生上述效果:

SimpleNode::getValue  -->SimpleNode::evaluateGetValueBody-->ASTEq::getValueBody-->OgnlOps::equal-->OgnlOps::compareWithConversion

protected Object evaluateGetValueBody(OgnlContext context, Object source)
            throws OgnlException
    {
        context.setCurrentObject(source);
        context.setCurrentNode(this);

if (!_constantValueCalculated)
        {
            _constantValueCalculated = true;
            boolean constant = isConstant(context);

if (constant)
            {
                _constantValue = getValueBody(context, source);
            }

_hasConstantValue = constant;
        }

return _hasConstantValue ? _constantValue : getValueBody(context, source);
    }

要找到原因不耐烦的话可以直接跳转到OgnlOps::compareWithConversion方法

public static int compareWithConversion(Object v1, Object v2)
    {
        int result;

if (v1 == v2) {
            result = 0;
        } else {
            int t1 = getNumericType(v1), t2 = getNumericType(v2), type = getNumericType(t1, t2, true);

switch(type) {
            case BIGINT:
                result = bigIntValue(v1).compareTo(bigIntValue(v2));
                break;

case BIGDEC:
                result = bigDecValue(v1).compareTo(bigDecValue(v2));
                break;

case NONNUMERIC:
                if ((t1 == NONNUMERIC) && (t2 == NONNUMERIC)) {
                    if ((v1 instanceof Comparable) && v1.getClass().isAssignableFrom(v2.getClass())) {
                        result = ((Comparable) v1).compareTo(v2);
                        break;
                    } else {
                        throw new IllegalArgumentException("invalid comparison: " + v1.getClass().getName() + " and "
                                + v2.getClass().getName());
                    }
                }
                // else fall through
            case FLOAT:
            case DOUBLE:
                double dv1 = doubleValue(v1),
                dv2 = doubleValue(v2);

                return (dv1 == dv2) ? 0 : ((dv1 < dv2) ? -1 : 1);

default:
                long lv1 = longValue(v1),
                lv2 = longValue(v2);

return (lv1 == lv2) ? 0 : ((lv1 < lv2) ? -1 : 1);
            }
        }
        return result;
    }

最终会走到上面标红部分代码,而空字符串也会被转换成double的0.0,此时当空字符串时packageType!= null and packageType!= '' or packageType == 0这个判断就会返回true,下面给出解决方案:

<if test="packageType!= null and packageType!= '' or packageType == '0'.toString()">
        and package_type = #{packageType,jdbcType=TINYINT}
      </if>

mybatis test把空字符串解析为0相关推荐

  1. 空字符,空格字符,空字符串,unicode表示字符

    unicode码编码规则     unicode码对每一个字符用4位 16进制数表示,即两个字节 ascall码     一个字符,占一个字节 所以用unicode码表示 ascall里面的字符 前面 ...

  2. mybatis 解析Integer为0的属性,解析成空字符串

    使用Mybatis时,常常会判断属性是否为空 1 <if test="type != null and type != ''"> 2 and type = #{type ...

  3. Mybatis Integer类型参数值为0时判断为空、空字符串不通过

    根据状态查询是,由于status是Integer类型,所以当前状态为0时,变成了查询了所有的状态信息. <if test="requestParam.status != null an ...

  4. 关于json格式字符串解析并用mybatis存入数据库

    园子里面找了很多关于json解析后存入数据库的方法,不是太乱,就是没有写完,我下面的主题代码多是受下面两位的启发,请按顺序查看 http://www.cnblogs.com/tian830937/p/ ...

  5. Gson解析空字符串异常的处理

    更多前沿课程:元宇宙:人类社会数字化转型(开学第一课)--机器学习视频教程-人工智能-CSDN程序员研修院 https://edu.csdn.net/course/detail/30449 Sprin ...

  6. 当类型设置为Integer时,传入的值为0,会将其转化为空字符串,从而造成查询数据异常

    今天在写一个普通的查询,条件查询状态为0时,查询总是异常,debug获取的参数都没问题,但查询后的结果是查询所有的数据 可以正常从前台获取数据: sql语句和代码写的都没毛病,后来仔细查阅了资料发现当 ...

  7. pandas使用read_csv函数读取文件并解析日期数据列(parse dates)、pandas使用read_csv函数读取文件并将缺失值转化为空字符串

    pandas使用read_csv函数读取文件并解析日期数据列(parse dates).pandas使用read_csv函数读取文件并将缺失值转化为空字符串 目录

  8. 字符串分隔 -连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。...

    •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组: •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理. 输入描述: 连续输入字符串(输入2次,每个字符串长度小于100) 输 ...

  9. Javascript中的0,false,null,undefined,空字符串对比

    先看一段代码: <script type="text/javascript">alert(typeof (false) === "boolean") ...

最新文章

  1. 《SAP FIORI 开发入门》课程答疑 第二期
  2. 批量图片压缩工具:JPGCompact 2.0绿色版
  3. mysql 获取刚插入行id汇总
  4. 【干货】产品经理解决问题七步法则
  5. java amqp_AMQP协议
  6. 介绍Node assert, should.js, mocha, Karma, Travis CI
  7. 解决linux系统WIFI无法使用5GHz频率的问题
  8. JSP开发常用问题解决
  9. java生成流程图_java源代码转换为流程图
  10. 数据系统服务器更新是什么,更新客户端数据,除了轮询请求服务端,还有什么解决方案?...
  11. 亚马逊广告基础、打法及报表分析(一)
  12. python文字游戏攻防_一个简单的孙悟空斗牛魔王的文字游戏
  13. vendor分区的库无法调用system分区的库
  14. 爬虫练习三:爬取链家二手房信息
  15. 怎么用matlab画心形曲线方程,matlab画心形曲线
  16. html--样式的建立style,css样式
  17. 如何实现限制上传或下载速度
  18. 【老李的模拟赛】【#4】【2014-08-09】
  19. HDOJ2955 Robberies(01背包,概率)
  20. 考研英语 - word-list-38

热门文章

  1. 什么叫html格式化,format是什么意思 格式化自己,只为删除你???
  2. OpenAnolis开源社区的萌芽与发展
  3. Kafka源码分析10:副本状态机ReplicaStateMachine详解 (图解+秒懂+史上最全)
  4. U3D-3D MAX Biped导出.fbx到Unity的Humanoid的骨架不匹配(Disable Triangle Pelvis, Enable Triangle Neck)
  5. 使用JAVA对象和JSON相互转换问题
  6. 【激光测距仪方案】激光测距仪的测量原理及作用方法
  7. Acwing 905. 区间选点
  8. Brendan Collins:物联网如何改变了你对存储的看法
  9. 拦截手机发送的请求,对请求信息进行获取
  10. 2016百度之星 初赛(Astar Round2B) 1001 区间的价值