Mybatis的mapper.xml中if标签test判断的用法说明
作者:大唐冠军侯 发布时间:2023-12-23 23:04:16
标签:Mybatis,mapper.xml,if,test
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>
来源:https://blog.csdn.net/DATANGguanjunhou/article/details/106426229
0
投稿
猜你喜欢
- 本文实例为大家分享了java实现单链表、双向链表的相关代码,供大家参考,具体内容如下java实现单链表:package code;class
- Apache Dubbo是一款高性能、轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡
- 本文实例为大家分享了java常用工具类的具体代码,供大家参考,具体内容如下Random随机数工具类package com.jarvis.ba
- Reflections通过扫描classpath,索引元数据,并且允许在运行时查询这些元数据。使用Reflections可以很轻松的获取以下
- 一、系统启动后注入配置package com.example.config;import org.springframework.beans
- 1、获取Class对象在 Java API 中,提供了获取 Class 类对象的三种方法:第一种,使用 Class.forName 静态方法
- 简述:JRebel是一款JVM插件,它使得Java代码修改后不用重启系统,立即生效。IDEA上原生是不支持热部署的,一般更新了 Java 文
- 在上节使用了H2之后感觉很爽,很轻便,正好有个项目要求简单,最好不适用外部数据库,于是就想着把H2数据库集成进来,这个系统已经存在了一个Or
- requestFoucs();无效。requestFoucsFromTouch();无效。webview.setTouchListener;
- 在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样?动手做实验:interface A{ void
- OSS不支持通过一个网络地址来上传图片,所以若想将网络上的图片上传到OSS上需要走点弯路。1、通过链接将图片下载到本地的一个文件夹下面2、用
- 本文实例讲述了java GUI编程之监听操作。分享给大家供大家参考,具体如下:当点击Frame中的component组件时,会产生相应的效果
- 静态代理: 由我们开发者自己手动创建或者在程序运行前就已经存在的代理类,静态代理通常只代理一个类, * 是代理一个接口下的多个实现类。动态
- 这篇文章主要介绍了JDBC自定义连接池过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参
- 一、概述Groovy is a multi-faceted language for the Java platform.Apache Gr
- 一、新建BeanUtil类import lombok.extern.slf4j.Slf4j;import org.springframewo
- 问题描述在开发批量删除功能时,往往都是多条数据,所以前台需要传一个数组给后台,但是怎么在URL中绑定一个数组,同时在后台用@PathVari
- Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对
- 今天给大家提供一个由今天给大家提供一个由Java swing实现的酒店管理系统,数据库采用sqlserver,我会贴上部分代码,完整的代码请
- 一、NIOjava.nio全称java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,为所