Mybatis的mapper.xml中if标签test判断的用法说明

目录
  • mapper.xml中if标签test判断的用法
    • 1. 字符串等于条件的两种写法
    • 2. 非空条件的判断
    • 3. 判断数组是否包含某个元素
  • mapper.xml <if test>书写时候的一些坑
    • 1. 分页
    • 2. 字符串形式的数据比较

mapper.xml中if标签test判断的用法

1. 字符串等于条件的两种写法

① 将双引号和单引号的位置互换

<if test=' testString != null and testString == "A" '>
   AND 表字段 = #{testString}
</if>

② 加上.toString()

<if test=" testString != null and testString == 'A'.toString() ">
  AND 表字段 = #{testString}
</if>

2. 非空条件的判断

长久以来,我们判断非空非null的判断条件都是如下所示:

<if test="xxx !=null and xxx !=''">

但是这样的判断只是针对String的,如果是别的类型,这个条件就不一定成立了,比如最经典的:当是数字0时,这个判断就会把0过滤掉,所以如果要判断数字,我们一般会再加上一个0的判断(这和mybatis的源码逻辑有关,有兴趣的可以去看看源码)

<if test="xxx !=null and xxx !='' or xxx == 0">

但是如果传进来的是数组或者集合呢?我们要再写别的判断吗?能不能封装个方法呢?

答案是可以的。

if标签里面的test判断是可以使用工具类来做判断的,毕竟test后面跟的也是一个布尔值,其用法是:

<if test="@完整的包名类名@方法名(传参)">

例如:

<if test="@com.xxx.util.MybatisTestUtil@isNotEmpty(obj)">

下面是我写的一个简陋的工具类,不是很全面,抛砖引玉,各位可以根据需要补充。

import java.util.Collection;
import java.util.Map;
/**
 * @description: mybatis的<if test="">标签中使用的非空判断工具类
 *      使用方式:<if test="@com.xxx.xxx.util.MybatisTsetUtil@isNotEmpty(obj)">
 * @author: singleDog
 * @date: 2020/7/20
 */
public class MybatisTestUtil {
    public static boolean isEmpty(Object o) {
        if (o == null) {
            return true;
        }
        if (o instanceof String) {
            return ((String) o).trim().length() == 0;
        } else if (o instanceof Collection) {
            return ((Collection) o).isEmpty();
        } else if (o instanceof Map) {
            return ((Map) o).isEmpty();
        } else if (o.getClass().isArray()) {
            return ((Object[]) o).length == 0;
        } else {
            return false;
        }
    }
    public static boolean isNotEmpty(Object o) {
        return !isEmpty(o);
    }
}

3. 判断数组是否包含某个元素

<if test="list.contains(xxx)">
    //...
</if>

注意,元素类型是字符串的话,参考1中的写法,一般这样写

<!--包含-->
<if test="list.contains('示例元素'.toString())">
    //...
</if>

<!--不包含-->
<if test="!list.contains('示例元素'.toString())">
    //...
</if>

mapper.xml <if test>书写时候的一些坑

1. 分页

map中添加了两个int类型的数据,

map.put("startNum",(page.getPageNum()-1)*page.getNumPerPage());
map.put("pageSize",page.getNumPerPage());

错误的SQL书写:

<if test="startNum != null  and startNum != '' ">
       LIMIT #{startNum},#{pageSize}
</if>

正确的SQL书写

<if test="startNum != null">
       LIMIT #{startNum},#{pageSize}
</if>

因为startNum里存的是int数据,所以不能与空字符串进行比较,强行比较时会报错。

2. 字符串形式的数据比较

map中添加的是一个字符串形式的“1”

map.put("uploadFlag",upload.getUploadFlag());

如果想在XML中比较,以下两种方式都可以:

2.1 test使用双引号

比较的对象使用单引号点toString()方法:

<if test="uploadFlag=='1'.toString()">
     and pw.id in (select pw_id from t_contract_upload)
</if>

2.2 test使用单引号

比较的对象直接使用双引号:

<if test='uploadFlag=="2" '>
     and pw.id in (select pw_id from t_contract_upload)
</if>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • mybatis中mapper.xml文件的常用属性及标签讲解

    目录 ${}和#{}的区别 常见的属性 常见标签 < sql >标签 < where >和< if >标签 < set >标签 < trim>标签 < choose >标签 mybatis 的xml文件中标签错误 ${}和#{}的区别 #{}会自动在你要插入字段两端 加上引号.例如:你写的是order by #{username},传的是 zhangsan,那么会解析成order by "zhangsan". ${

  • Mybatis的xml中使用if/else标签的具体使用

    目录 使用if标签进行查询 where标签出场 if/else 使用 choose,when,otherwise 代替 使用if标签进行查询 SELECT orderNo, adname, orderstatus FROM order_A where <if test="order!=null"> order=#{order} </if> <if test="title!=null"> and title=#{title} <

  • 在mybatis中使用mapper进行if条件判断

    目的: 在使用mybatis框架中mapper文件有自动生成,但有时需要自己添加sql语句进行开发,当遇到需要使用 if进行条件判断的时候该怎么写? 查询sql语句如下: <select id="queryData" parameterType="com.pojo.QueryDetailReq" resultType="com.pojo.MxDataInfo"> select * from db_trd.tb_trd_secu_ord

  • Mybatis的mapper.xml中if标签test判断的用法说明

    目录 mapper.xml中if标签test判断的用法 1. 字符串等于条件的两种写法 2. 非空条件的判断 3. 判断数组是否包含某个元素 mapper.xml <if test>书写时候的一些坑 1. 分页 2. 字符串形式的数据比较 mapper.xml中if标签test判断的用法 1. 字符串等于条件的两种写法 ① 将双引号和单引号的位置互换 <if test=' testString != null and testString == "A" '>  

  • mybatis的mapper.xml中resultMap标签的使用详解

    1.前言 最近博主在做一个ssm框架的共享汽车管理系统,其中,数据库字段设计的有下划线方式,a_username,然后在写mapper.xml里面的sql语句的时候,一直出现查询语句查询的值为null的情况.或者是resultMap标签和驼峰规则不太明白的同学,可以看这里. 于是顺便梳理一下. 2.关于resultMap 2.1.什么是resultMap? 在mybatis中有一个resultMap标签,它是为了映射select查询出来结果的集合,其主要作用是将实体类中的字段与数据库表中的字段进

  • mybatis的映射xml中动态设置orderby方式

    目录 mybatis 映射xml动态设置orderby mybatis动态传入order by参数的正确方式 mybatis 映射xml动态设置orderby mybatis的dao xml中,根据参数值设置不同的order by字段. dao java List<DzRainDetail> queryDetail(@Param("masterId") int masterId, @Param("country") String country, @Pa

  • MyBatis Mapper.xml中的命名空间及命名方式

    目录 Mapper.xml相关使用 命名空间(Namespaces) 命名解析 MyBatis中mapper.xml命名空间错误 项目场景 问题描述 原因分析 解决方案 Mapper.xml相关使用 命名空间(Namespaces) 命名空间(Namespaces) 在之前版本的MyBatis中是可选的,这样容易引起混淆因此毫无益处.现在命名空间则是必须的,且易于简单地用更长的完完全限定名来隔离语句. 命名空间使得你所见到的接口绑定成为可能,尽管你觉得这些东西未必用得上,你还是应该遵循这里的规定

  • 解决Mybatis映射文件mapper.xml中的注释问题

    目录 Mybatis映射文件mapper.xml的注释问题 报错信息 解决办法 mapper.xml文件中的注释 注释方式 ‘无效的列索引’bug和解决 小结一下 Mybatis映射文件mapper.xml的注释问题 从昨天夜晚9点到今天中午,一直被项目bug所困惑,中间这段时间一直未解决这个问题,也咨询很多群里大佬,也未能解决 有的说是我代码写的有问题,如mapper文件中没有写入参数类型parameterType,也有说是我项目结构目录构建出错,按照他们的建议进行修正,也是未尽人意,启动项目

  • mybatis mapper.xml中如何根据数据库类型选择对应SQL语句

    目录 mapper.xml根据数据库类型选择对应SQL语句 1.spring-database.xml文件中配置 2.mapper.xml文件中配置 mapper.xml动态SQL语句用法 if trim where set choose(when.otherwise) foreach mapper.xml根据数据库类型选择对应SQL语句 1.spring-database.xml文件中配置   <bean id="vendorProperties" class="or

  • IDEA mybatis Mapper.xml报红的最新解决办法

    现象 在IDEA中已经配置好Database了,但是打开mybatis的Mapper.xml中的字段还是报红.如下 : 随便不影响程序运行,但是非常的不舒服.智能提示也不好用. 解决办法 File -> Settings->Lanuages & Frameworks-> SQL Dialects在Global SQL Dialect:或者Project SQL Dialect:中选择正确的数据库. 比如:我这里默认是Microsoft SQL Server,只要修改成我项目中使用

  • mybatis如何通过接口查找对应的mapper.xml及方法执行详解

    本文主要介绍的是关于mybatis通过接口查找对应mapper.xml及方法执行的相关内容,下面话不多说,来看看详细的介绍: 在使用mybatis的时候,有一种方式是 BookMapper bookMapper = SqlSession().getMapper(BookMapper.class) 获取接口,然后调用接口的方法.只要方法名和对应的mapper.xml中的id名字相同,就可以执行sql. 那么接口是如何与mapper.xml对应的呢? 首先看下,在getMapper()方法是如何操作

  • mybatis映射文件mapper.xml的具体写法

    Mapper映射文件是一个xml格式文件,必须遵循相应的dtd文件规范 在学习mybatis的时候我们通常会在映射文件这样写: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd&q

  • java应用开发之Mybatis通过Mapper代理自定义接口的实现

    如何实现?主要分为以下两步骤 1.通过 Mapper 代理实现⾃定义接口 2.编写与方法相对应的 Mapper.xml 1.自定义接口AccountRepository package repository; import entity.Account; import java.util.List; public interface AccountRepository { public int save(Account account); public int update(Account ac

随机推荐