MyBatis Mapper常用动态SQL之foreach 、if、choose、where、when

2023-05-16

if语句

<if>判断语句,用于单条件分支条件判断

使用<if>元素对参数username和jobs进行非空判断,并动态组装SQL:

select * from t_person where 1=1 
     <if test="username !=null and username !=''">
	and username like concat('%',#{username}, '%')
     </if>
     <if test="jobs !=null and jobs !=''">
	and jobs = #{jobs}
     </if>

choose 、when 、 otherwise 语句

<choose>用于多条件分支判断,相当于Javaswitch ... case ... default

使用<choose>及其子元素依次对条件进行非空判断,并动态组装SQL:

  select * from t_person where 1=1
  <choose>
       <when test="username !=null and username !=''">
            and username like concat('%',#{username}, '%')
       </when>
       <when test="jobs !=null and jobs !=''">
            and jobs= #{jobs}
       </when>
       <when test="phone != null and phone != ''">
            and phone= #{phone}
       </when>
       <otherwise>
            1=1
       </otherwise>
  </choose>

加入了条件“where 1=1”后,既保证了where后面的条件成立,又避免了where后面第一个词是and或者or之类的关键词。
当用户一个条件都不选时,可以在<otherwise>中写上1=1让语法成立,反之,若选择了条件则会返回正常结果

where 、 trim 语句

针对上述情况中“where 1=1”,在MyBatis的SQL中就可以使用<where><trim>元素进行动态处理

<select id="selectPerson">
select * from t_person
<trim prefix="where" prefixOverrides="and">
     <if test="username !=null and username !=''">
         and username like concat('%',#{username}, '%')
     </if>
     <if test="jobs !=null and jobs !=''">
         and jobs= #{jobs}
     </if>
</trim>
</select>
<select id="selectPerson">
select * from t_person
<where>
    <if test="username !=null and username !=''">
            and username like concat('%',#{username},'%')
    </if>
    <if test="jobs !=null and jobs !=''">
            and jobs= #{jobs}
    </if>
</where>
</select>

trim标签:prefixOverrides=“and|or” prefix=“where” suffixOverrides=“” suffix=“”

属性介绍常用值
prefixOverrides前缀覆盖and或or
prefix前缀一般是where或者set(只执行一次)
suffixOverrides后缀覆盖一般是逗号,
suffic后缀一般是更新语句的查询条件

<trim>标签可以处理<where><set>标签所需要处理的问题,根据需求使用即可,举个例子,下面通过输入哪些参数,就更新哪些参数:

<update id="">
update t_person 
<trim prefix="set" suffix="where id=#{personId}" suffixOverrides="," >
<if test="username !=null and username !=''">
   username = #{username}
</if>
<if test="jobs !=null and jobs !=''">
   jobs = #{jobs}
</if>
<if test="phone !=null and phone !=''">
   phone = #{phone}
</if>
</trim>
</update>

使用和元素对username和jobs进行更新判断,并动态组装SQL。这样就只需要传入想要更新的字段即可

<update id="updatePerson"  parameterType="com.ssy.po.Person">
        update t_person
        <set>
            <if test="username !=null and username !=''">
                  username=#{username},
            </if>
            <if test="jobs !=null and jobs !=''">
                  jobs=#{jobs},
            </if>
        </set>
        where id=#{id}
</update>

使用<set><if>结合的方式来组装update语句。<set>(进行更新字段时,要确保更新的字段不能为空)元素会动态前置 SET关键字,同时也会消除多余的‘,’

foreach语句

foreach五大标签:

标签描述
collection该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,默认使用list
item表示集合中每一个元素进行迭代时的别名,随便起的变量名;
index也就是索引,用于表示在迭代过程中,每次迭代到的位置;
open表示该语句以什么开始,常用“(”;
separator表示在每次进行迭代之间以什么符号作为分隔符,常用“,”;
close表示以什么结束,常用“)”;

对于collection如果dao层接口没有用@Param注解时,默认使用list作为集合,如果是数组则为array
如果不在open、close、separate标签中明确,就得在mapper循环前后加上(),以及英文逗号,

批量插入操作,传入参数是一个list,数组中存放的对象,示例:

<insert id="batchInsert">
    insert into t_person (a, b, c, d)
    values
    <foreach collection="list" item="item" separator=",">
        (#{item.a,jdbcType=BIGINT}, #{item.b,jdbcType=VARCHAR},
        #{item.c,jdbcType=DECIMAL}, #{item.d,jdbcType=DECIMAL})
    </foreach>
</insert>   

批量查询操作,通常和in语句已使用,示例:

List<ActSmsSendAudit> batchQueryByIdList(@Param("idList") List<Integer> idList);
  <select id="batchQueryByIdList">
    select *
    from t_person
    where id in
      <foreach collection="idList" item="item" index="index" open="(" close=")" separator=",">
        #{item}
      </foreach>
  </select>

如果不使用foreach直接写sql语句:

  <select id="batchQueryByIdList">
    select *
    from t_person
    where id in (  ,  , )
  </select>

可以看出,如果使用MyBatis的动态sql可以传任意的数量id,使用传统查询只能固定数量的数据。

批量更新操作

  <update id="updateActivityStatus" parameterType="int" >
    UPDATE marketing_activity_list SET status=0
    WHERE
    <foreach collection="list" item="id" separator="or">
      activity_seq = #{id}
    </foreach>
  </update>

灵活运用foreach可以做到事半功倍的效果!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis Mapper常用动态SQL之foreach 、if、choose、where、when 的相关文章

  • 使用inception模型进行迁移学习

    迁移学习相关知识可以参考 xff1a 庄福振 罗平 何清 等 迁移学习研究进展 J 软件学报 2015 26 1 26 39 本文涉及内容主要有 xff1a 1 如何使用现有模型进行分类 2 如何得到样本的transfer values 3
  • tensorflow 模型保存与加载

    http cv tricks com tensorflow tutorial save restore tensorflow models quick complete tutorial 什么是TF模型 xff1a 在训练一个神经网络模型后
  • docker配置proxy

    Control and configure Docker with systemd Estimated reading time 3 minutes Many Linux distributions use systemd to start
  • Nginx部署vue项目配置

    Nginx部署vue项目配置 记录一下 Nginx部署vue项目 user root worker processes 1 error log home hongtu web logs error log error log logs er
  • 一个脚本打比赛之SMP WEIBO 2016

    一个脚本打比赛之SMP WEIBO 2016 前言 xff1a 如何对用户进行精准画像是社交网络分析的基础问题 本文就如何对weibo用户网络提取特征发表一点小的想法 xff0c 还请尽管拍砖 数据来源 xff1a SMP WEIBO 20
  • SMP_WEIBO_2016 微博用户画像 可视化(未完成)

    这个数据集标注的用户有4467位 xff0c 通过筛选 xff0c 将网络范围缩小到标注用户以及与标注用户具有关注关系的用户 xff0c 筛选后网络节点数量为445150个节点 首先观察网络的形态 工具 xff1a gephi 节点颜色 x
  • aircrack-ng进行WPA2无线网络密码强度测试使用心得

    硬件 xff1a 电脑 树莓派 ALFA AWUS036NH 某宝140元 软件 xff1a 按照http kamilslab com 2017 04 10 how to crack wpa2 wifi networks using the
  • win7安装dlib

    只需要conda环境 xff0c 完全不需要vs xff0c cmake xff0c 气人 python版本 xff1a 3 6 方法一 xff1a xff08 容易与tensorflow xff0c matplotlib等冲突 xff09
  • 随便看看数据科学比赛的感慨

    biendata中的比赛 xff1a 感觉比赛难点并没有增加 xff0c 更多的是工程化的问题 各个比赛仍然是一个学习实践的好机会 xff0c 可以快速的了解当前新的方向 xff0c 在某一个领域内学习非常多的解决方案 很想继续参加 xff
  • 嵌入式和单片机的关系

    华清远见的老师说 xff1a 单片机属于嵌入式的一种 网友说 单片机是典型的嵌入式系统 波哥说 xff1a 以前的单片机都是裸机 xff0c 没有操作系统 现在的单片机都安装了操作系统 嵌入式操作系统包括Linux和等等
  • 电子版证件照怎么制作并改大小

    在我们平时的生活中 xff0c 经常会使用到电子版证件照 xff0c 比如一些考试报名或者电子简历制作等 我们都知道 xff0c 不同用途的证件照尺寸也各有不同 xff0c 那么除了去照相馆重新拍摄外 xff0c 可不可以自己修改尺寸大小呢
  • 这些JVM 多线程 网络编程面试大厂必问的Java面试题,你都刷了吗?

    目录 面试常问spring 不同版本的 Spring Framework 有哪些主要功能 xff1f Spring Framework 有哪些不同的功能 xff1f 什么是 Spring 配置文件 xff1f 使用 Spring 有哪些方式
  • 每日算法----左叶子之和----2020/09/19

    目录 1 题目描述 xff1a 左叶子之和2 实例 xff1a 3 思路 xff1a 4 遇上的问题 xff1a 5 结果6 反思 xff1a 7 学习他人优秀的算法8 学习他人的收获 xff1a 1 题目描述 xff1a 左叶子之和 计算
  • Ubuntu学习(一)Ubuntu下为SD卡分区

    虚拟机 xff1a VirtualBox 43 Ubuntu 10 04 LTS 摘要 xff1a 将SD卡分为boot rootfs和START HERE三个分区 xff0c boot分区为fat32格式 xff0c rootfs和STA
  • 关于 mavlink 协议(Ver1.0),略谈几句

    mavlink目前已经更新到2 0版本 xff0c 但由于我对2 0没有深入研究 xff0c 故以下阐述均基于1 0展开 xff08 mavlink协议官网 xff1a https mavlink io en xff09 mavlink1
  • 关于飞控硬件设计实现过程中遇到的干扰与振动问题

    电磁干扰问题一直贯穿在飞控硬件设计 实现 调试过程中 xff0c 主要会碰到以下几类 xff1a 1 mcu 对gps的干扰 xff0c 这个问题貌似是使用stm32芯片的独享 xff0c 网上一搜 xff0c 对stm32干扰gps的血泪
  • 答学生问:研究生的论文工作需要创新吗?

    xfeff xfeff http blog sciencenet cn blog 53846 323785 html 某学生在我的上一篇博文中留言如下 xff1a 您好 xff0c 我是计算机学院的研究生 xff0c 之前对您的感觉一直是您
  • 树莓派烧录系统且无显示器使用putty和VNC远程桌面连接

    目录 一 树莓派硬件二 镜像烧写及远程连接前的准备1 xff09 下载镜像文件及安装工具2 xff09 烧录镜像文件3 xff09 创建两个文件4 xff09 寻找树莓派的 IP 地址 三 puTTY 远程连接1 xff09 puTTY 安
  • 基于 MDK 创建 STM32 汇编程序:串口输出 Hello world

    目录 一 编写代码二 结果显示三 总结四 参考资料 说明 xff1a 本文在 基于 MDK 创建 STM32 汇编语言工程并分析 HEX 文件内容 的基础上用汇编程序完成一个输出 Hello world 到串口的程序 实验工具 野火串口调试
  • 解决unable to access ‘https://github.com/...‘: OpenSSL SSL_read: Connection was reset, errno 10054

    1 git config global http sslVerify false 2 分别输入两行命令 git config span class token operator span global span class token op

随机推荐

  • 树莓派开机自动连接wifi设置,并修改静态IP

    一 修改配置文件 修改配置文件 etc wpa supplicant wpa supplicant conf 在终端中输入 xff1a sudo nano etc wpa supplication wpa supplication conf
  • Gazebo仿真PX4运行roslaunch PX4 mavros_posix_sitl.launch时报错Required process [sitl-2] has died 解决方法

    报错如图 解决方法为卸载Gazebo9安装Gazebo9 19 参考下文中4 4部分 xff0c 问题类似但解决方法相同 xff1a https blog csdn net qq 38768959 article details 10604
  • PTA第十五周

    6 4 指定位置输出字符串 20分 本题要求实现一个函数 xff0c 对给定的一个字符串和两个字符 xff0c 打印出给定字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符 函数接口定义 xff1a char mat
  • 6-27复习

    1 while语句的一般形式如下 xff0c 其中的循环体语句只能是一条语句 while 表达式 循环体语句 答案 xff1a T 解析 xff1a for 循环和while 循环循环体都是一条语句 xff0c 但是可以加 变成复合语句 x
  • 如何在Ubtun上安装vscode,保姆级教程

    Ubtun安装vscode 打开vm虚拟机安装VM tools 主要目的 xff1a 实现win上的文件与vm虚拟机上的文件进行共享 具体过程 参照B站 Ubuntu安装vmware tools和open vm tools Ubuntu安装
  • python matplotlib生成图表基础

    本节的目标是绘制一个y 61 x 2的函数图像 plot图表 绘制图表 plot xff08 xff09 函数绘制图表 xff0c 传入参数 xff0c 输入值和输出值 xff0c 还可以指定其他参数 plt span class toke
  • Cannot make a static reference to the non-static method XXX() from the type XXX

    不能用调用静态方法的方式调用一个非静态的方法 xff1a 我在定义方法的时候不是static的 出现这个报错是因为java调用任何方法都要实例化 xff0c c 43 43 里有函数的概念 xff0c 但是java里的函数实际上是类的方法
  • 【2022_10_17】PX4学习

    commander cpp内 int Commander custom command int argc char argv 221行 该函数接受所有commander输入的参数 xff0c strcmp比较后调用不同的函数 strcmp返
  • how to solveE:Unmet dependencies.Try‘apt --fix ^^^^^

    span class token function sudo span span class token function apt span span class token function install span span class
  • PX4报错FAILED: external/Stamp/sitl_gazebo/sitl_gazebo-configure解决

    PX4仿真gazebo报错 make px4 sitl default gazebo Configuring incomplete errors occurred span class token operator span See als
  • 汉诺塔问题的解法

    问题描述 相传在古印度圣庙中 xff0c 有一种被称为汉诺塔 Hanoi 的游戏 该游戏是在一块铜板装置上 xff0c 有三根杆 编号A B C xff0c 在A杆自下而上 由大到小按顺序放置64个金盘 如下图 游戏的目标 xff1a 把A
  • 51单片机——串口通信(发送和接受数据)

    目录 一 实现的功能 二 串口通信 2 1单片机发送数据 2 1 1串口初始化 2 1 2串口发送程序 2 1 3发送效果 2 2单片机接收数据 2 2 1串口初始化 2 2 2接收数据程序 2 2 3接收效果 一 实现的功能 通过串口 x
  • 无人机仿真SLAM_gazebo&promethues

    无人机仿真 总体概述系统要求 PX4固件简介无人机固件整体框图无人机软件框图无人机硬件模型 Mavlink模块位置估计与姿态估计模块安装与编译二次开发 机载计算机程序控制模块估计模块仿真模块SLAM模块SLAM效果演示 总体概述 无人机仿真
  • 编译orbslam2时,Pangolin could not be found because dependency Eigen3 could not be found,解决方法

    是因为使用了pangolin0 6版本 xff0c 需要重新安装0 5版本的pangolin 1 在pangolin的build文件夹下 sudo make uninstall 2 usr local include 删除pangolin文
  • CMakeLists.txt常用语法

    0 绪 cmake 是一个跨平台 开源的构建系统 它是一个集软件构建 测试 打包于一身的软件 它使用与平台和编译器独立的配置文件来对软件编译过程进行控制 1 常用命令 1 1制定cmake最小版本 cmake minimum require
  • Vue 模板

    原文 在Vue中 xff0c Vue模板对应的就是Vue中的View xff08 视图 xff09 部分 xff0c 也是Vue重中之一 xff0c 而在Vue中要了解Vue模板我们就需要从两个方面来着手 xff0c 其一是Vue的模板语法
  • Ubuntu:系统分区

    在系统分区之前 先进行磁盘分区 这里针对的是window10系统下安装ubuntu双系统 需要在window10下进行磁盘分区来安装ubuntu系统 一 磁盘分区 win10系统下 右击此电脑 xff0c 点击管理就进入磁盘管理 这时候可以
  • Mac 安装node.js

    Mac系统安装Node js xff0c 下载地址 如上图安装路径 xff1a This package will install Node js v16 19 1 to usr local bin node span class toke
  • MySQL 常用函数(二)

    ABS函数 xff1a 求绝对值 绝对值函数 ABS x 返回 x 的绝对值 正数的绝对值是其本身 xff0c 负数的绝对值为其相反数 xff0c 0 的绝对值是 0 span class token keyword SELECT span
  • MyBatis Mapper常用动态SQL之foreach 、if、choose、where、when

    if语句 lt if gt 判断语句 xff0c 用于单条件分支条件判断 使用 lt if gt 元素对参数username和jobs进行非空判断 xff0c 并动态组装SQL xff1a span class token keyword