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


猜你喜欢
- 1、效果2、简介本文主角是ItemTouchHelper。它是RecyclerView对于item交互处理的一个「辅助类」,主要用于拖拽以及
- Compose的诞生在2019年的谷歌IO大会上,Compose作为Android新一代UI开发亮相,因为声明式开发越来越流行了,对标IOS
- init和clinit区别①init和clinit方法执行时机不同init是对象构造器方法,也就是说在程序执行 new 一个对象调用该对象类
- 本文通过优化买票的重复流程来说明享元模式,为了加深对该模式的理解,会以String和基本数据类型的包装类对该模式的设计进一步说明。读者可以拉
- **********************************************************************
- 本文实例讲述了C#获取U盘序列号的方法。分享给大家供大家参考。具体如下:using System.Management;private Li
- 学C#的原因其实挺简单的,因为一直对游戏挺感兴趣,查了下比较流行的游戏引擎Unity的主要开发语言是C#,所以就决定从C#入手,学学面向对象
- java读取word文档时,虽然网上介绍了很多插件poi、java2Word、jacob、itext等等,poi无法读取格式(新的API估计
- 微软Office Word本身已经提供了另存为PDF文档功能,对于少量文档,手工使用该方式进行Word转换为PDF尚可,一旦需要处理大量的文
- 一、树的概念和结构1.1 树的概念树是一种非线性的数据结构,它是由 n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因
- 在开发过程中,碰到生成一个List对象,需要对其里面的每个对象都进行校验。但是,这个Lis
- class MyThreadScopeData { // 单例 &nbs
- 本文实例讲述了java实现切割wav音频文件的方法。分享给大家供大家参考,具体如下:import it.sauronsoftware.jav
- 在C# winform应用程序中,用以下代码可以进行一些内存使用的优化using System;using System.Diagnosti
- 1、导包,四大核心包,一个切面包(AOP),logging,web,springmvc2、配置文件,核心代码如下:web.xml<se
- 一、讲个事故接口安全老生常谈了过年之前做了过一款飞机大战的H5小游戏,里面无限模式-需要保存用户的积分,因为使用的Body传参,参数是可见的
- 表单代码<!DOCTYPE html><html lang="en" xmlns="http
- Groovy简介Groovy 是增强 Java 平台的唯一的脚本语言。它提供了类似于 Java 的语法,内置映射(Map)、列表(List)
- PagerBottomTabStrip 是一个基本按谷歌Material Design规范完成的安卓底部导航栏控件官方设计规范:https:
- 现在智能手机基本都是触摸操作,点击按钮是一种交互方式,同时手势相关的操作,比如滑动等等同样是很重要的交互方式。这篇文章是对安卓手势交互相关知