【MyBatis】如何使用“动态SQL”(不用找了,这一篇足矣)

news2024/9/27 5:51:55

目录

一、if标签

二、where标签

三、trim标签

四、choose、when、otherwise

五、foreach标签

六、sql标签


一、if标签

        if,通过test属性中的表达式判断标签中的内容是否有效(有效才将if里面的内容拼接到sql中);一般用于用户在选填项中进行描述;

例如:在员工表中,根据姓名,年龄,性别查询员工信息(并且名字、年龄、姓名、若任意一个选填项为空,就不根据此条信息进行查询)

    <select id="getEmpByCondition" resultType="Emp">
        select * from emp where
        <if test="empName != null and empName != ''">
            emp_name = #{empName}
        </if>
        <if test="age != null and age != ''">
            and age = #{age}
        </if>
        <if test="gender != null and gender != ''">
            and gender = #{gender}
        </if>
    </select

if语句会遇到的问题:

        若empName,age,gender其中任意一项为空,都可能会导致sql语句语法错误,例如,empName为空,sql语句就变成了select * from emp where and age = ? and gender = ?;显然这里的where后面紧跟了一个and,这是错误的;另外,若这三个属性都为空,sql语句就变成了select * from emp where;这里多了一个where也是错的,那么该怎么办呢?

正确写法如下:

    <select id="getEmpByCondition" resultType="Emp">
        select * from emp where 1=1
        <if test="empName != null and empName != ''">
            and emp_name = #{empName}
        </if>
        <if test="age != null and age != ''">
            and age = #{age}
        </if>
        <if test="gender != null and gender != ''">
            and gender = #{gender}
        </if>
    </select>

解释:

        只需要在where后面加上一个1=1的恒成立条件(辅助拼接后面的and,某些情况下让where有意义),并且在每一个if的sql前面都加上一个and即可,这个时候,无论哪个if不成立,或者是都不成立,sql语句都不会出现语法错误;

这里其实还有第二种解决策略,就要用到动态sql中的另一个标签where~往下看


二、where标签

where标签功能:

a.若where标签中有条件成立,会自动生成where关键字;

b.会自动将where标签中内容前多余的and去掉;

c.若where标签中没有任何一个条件成立,则where没有任何功能;

where标签的使用:只需要将对应的if标签包裹起来即可;

例如:在员工表中,根据姓名,年龄,性别查询员工信息

    <select id="getEmpByCondition" resultType="Emp">
        select * from emp
        <where>
            <if test="empName != null and empName != ''">
                emp_name = #{empName}
            </if>
            <if test="age != null and age != ''">
                and age = #{age}
            </if>
            <if test="gender != null and gender != ''">
                and gender = #{gender}
            </if>
        </where>
    </select>

若emp_name为null,where标签就会去除后面的and标签,效果如下:

若全为空,where标签就不起作用,效果如下:


三、trim标签

trim标签的作用实际上就是他的四个属性:

prefix, suffix:在标签中内容前面或后面添加指定内容;

prefixOverrides, suffixOverrides:在标签中内容前面或后面去掉指定内容;

例如:在员工表中,根据姓名,年龄,性别查询员工信息(去掉前后多余的and,并指定添加where)

    <select id="getEmpByCondition" resultType="Emp">
        select * from emp
        <trim prefix="where" suffixOverrides="and">
            <if test="empName != null and empName != ''">
                emp_name = #{empName} and
            </if>
            <if test="age != null and age != ''">
                age = #{age} and
            </if>
            <if test="gender != null and gender != ''">
                gender = #{gender}
            </if>
        </trim>
    </select>

四、choose、when、otherwise

他就相当于Java中的switch语句一样:

choose就相当于switch;

when就相当于case:...break,可以有多个,满足任意一个条件就会后面的就都不执行了;

otherwise就相当于default,最多设置一个,所有when都不满足就会执行他;

例如:在员工表中,根据姓名,年龄,性别查询员工信息(查询满足任意一个属性即可)

    <select id="getEmpByChoose" resultType="Emp">
        select * from emp
        <where>
            <choose>
                <when test="empName != null and empName != ''">
                    emp_name = #{empName}
                </when>
                <when test="age != null and age != ''">
                    age = #{age}
                </when>
                <when test="gender != null and gender != ''">
                    gender = #{gender}
                </when>
            </choose>
        </where>
    </select>

五、foreach标签

        foreach简单来讲就是一个循环,可以把我们想要循环的内容放入标签即可,同时通过几个属性控制循环:

collection:设置要循环的数组或集合(最好使用Parm注解在接口中标识,否则Mybatis会把这样一个集合放入Map中,规定list为键,以集合数据为值);

item:用来表示数组或集合中的每一个数据;

separator:循环中设置分隔符(会自动在你设置的分隔符前后加空格);

open:当前循环的所有内容以什么字符串为开始;

close:当前循环的所有内容以什么字符串为结束;

示例一(通过List集合批量增加):向emp表中插入多条数据

   <insert id="insertMoreEmp">
        insert into emp values
        <foreach collection="emps" item="emp" separator=",">
            (null, #{emp.empName}, #{emp.age}, #{emp.gender})
        </foreach>
    </insert>

执行结果:(例如插入三条数据)

示例二(批量删除) :删除emp中id为3,4的数据

    <delete id="deleteMoreEmp">
        delete from emp where emp_id in
        (
            <foreach collection="empIds" item="empId" separator=",">
                #{empId}
            </foreach>
        )
    </delete>

执行结果:

 示例三(使用open,close属性)

    <insert id="insertMoreEmp">
        insert into emp values
        <foreach collection="emps" item="emp" separator=",">
            (null, #{emp.empName}, #{emp.age}, #{emp.gender})
        </foreach>
    </insert>

示例四(玩转foreach)

    <delete id="deleteMoreEmp">
        delete from emp where
        <foreach collection="empIds" item="empId" separator="or" open="(" close=")">
            emp_id = #{empId}
        </foreach>
    </delete>

六、sql标签

sql标签可以记录一段sql,在需要用到的地方,使用include的标签进行引用

sql标签的属性id:表示这段sql的唯一身份标识;

include标签的属性 refid:标识引用sql标签的id,和sql标签的id是对应关系;

例如:记录emp_id, emp_name, age, gender这样个字段

    <sql id="empColumns">
        emp_id, emp_name, age, gender
    </sql>

    <select id="getEmpByConditionTwo" resultType="Emp">
        select <include refid="empColumns"></include> from emp
        <where>
            <if test="empName != null and empName != ''">
                emp_name = #{empName}
            </if>
            <if test="age != null and age != ''">
                and age = #{age}
            </if>
            <if test="gender != null and gender != ''">
                and gender = #{gender}
            </if>
        </where>
    </select>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/150954.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Authing 通过中国信通院「身份治理系统和工具能力」全面级评估

Authing 通过中国信通院「身份治理系统和工具能力」全面级评估 近期&#xff0c;Authing 荣获由中国信通院颁发的「身份治理系统和工具能力」全面级评估。在统一身份管理、统一认证管理、开发集成管理以及统一安全管理四个模块满足身份治理系统和工具支撑能力全面级要求。 评估…

Java--main()方法

文章目录一、main()方法使用二、mian()方法调用一、main()方法使用 1、访问控制权限是公有的&#xff08;public&#xff09; 2、main() 方法是静态的。如果要在 main() 方法中调用本类中的其他方法&#xff0c;则该方法也必须是静态的&#xff0c;否则需要先创建本类的实例对…

进程间通信【共享内存】

共享内存共享内存共享内存原理创建共享内存关联共享内存去关联共享内存控制共享内存使用共享内存代码共享内存 进程间通信的前提是&#xff1a;先让不同的进程&#xff0c;看到同一份资源 之前&#xff0c;管道进程通信是采用看到同一个文件&#xff0c;那么共享内存就是看到同…

审查 Git 仓库的绝佳工具Tig

简介 Tig 是一个 基于 ncurses 的 Git 文本模式界面&#xff0c;它允许你浏览 Git 仓库中的更改。它还可以充当各种 Git 命令输出的分页器。使用这个工具可以让我很好地了解在哪个提交中发生了哪些更改&#xff0c;最新的提交合并是什么等等。 git工作原理&#xff1a;https:…

黑马学ElasticSearch(三)

目录&#xff1a; &#xff08;1&#xff09;RestClient-操作索引库-导入demo &#xff08;2&#xff09;RestClient操作索引-hotel数据结构分析 &#xff08;3&#xff09;RestClient操作索引库-初始化RestClient &#xff08;4&#xff09;RestClient操作索引库-创建索引库…

如何掌握TikTok广告投放技巧,玩转“TikTok+独立站”新模式?

导读&#xff1a;TikTok已经发展成为全球第六大社交媒体网络&#xff0c;这使其成为一个非常富饶的广告目的地。 跨境卖家如何在 TikTok 上投放广告&#xff1f;在“TikTok独立站”模式中&#xff0c;卖家在 TikTok ads 上投放电商广告&#xff0c;用户点击后将跳转到独立站落地…

21. 合并两个有序链表(链表)

文章目录题目方法一 暴力法:创建头结点,比较拼接方法二 递归法参考文献题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,…

【从零开始学习深度学习】42. 算法优化之AdaDelta算法【基于AdaGrad算法的改进】介绍及其Pytorch实现

除了上一篇文章介绍的RMSProp算法以外&#xff0c;另一个常用优化算法AdaDelta算法也针对AdaGrad算法在迭代后期可能较难找到有用解的问题做了改进 。比较有意思的是&#xff0c;AdaDelta算法没有学习率这一超参数。 目录1. AdaDelta算法介绍2. 从零实现AdaDelta算法3. Pytorch…

UDS诊断系列介绍04-10会话服务

本文框架1. 系列介绍10服务概述2. 10服务请求与应答2.1 10服务请求2.2 肯定应答2.3 否定应答1. 系列介绍 UDS&#xff08;Unified Diagnostic Services&#xff09;协议&#xff0c;即统一的诊断服务&#xff0c;是面向整车所有ECU的一种诊断通信方式&#xff0c;是基于ISO 14…

Linux学习笔记——集群化环境前置准备

5.7、集群化环境前置准备 5.7.1、介绍 在前面&#xff0c;我们所学习安装的软件&#xff0c;都是以单机模式运行的。 后续&#xff0c;我们将要学习大数据相关的软件部署&#xff0c;所以后续我们所安装的软件服务&#xff0c;大多数都是以集群化&#xff08;多台服务器共同…

使用OpenCV读取视频、图片并做简单处理

1.OpenCV的安装与卸载 在conda中安装opencv&#xff0c;打开Anaconda Prompt 使用国内镜像源安装opencv&#xff0c;命令如下&#xff1a; pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple 也可以安装opencv的另一个扩展包opencv-contrib-python&am…

Centos下使用yum安装Mysql8(Mysql5.7)以及常见的配置和使用

记录一下在centos7.x下面使用yum方式安装mysql8(Mysql5.7)关系型数据库安装之前一般需要先确定centos7.x服务器里是否已经安装&#xff0c;未安装或者刚初始化的centos7.x服务器最好安装&#xff0c;原来已经有的要升级的话一定要对系统原有mysql 或mariadb卸载干净&#xff0c…

系统测试的具体测试类型

系统测试&#xff1a;是为判断系统是否符合要求而对集成的软、硬件系统进行的测试活动、它是将已经集成好的软件系统&#xff0c;作为基于整个计算机系统的一个元素&#xff0c;与计算机硬件、外设、某些支持软件、人员、数据等其他系统元素结合在一起&#xff0c;在实际运行环…

Charles - 夜神模拟器证书安装App抓包

Charles - 夜神模拟器证书安装App抓包 文章目录Charles - 夜神模拟器证书安装App抓包前言一、软件安装1.Openssl安装1.1下载安装1.2配置环境变量1.3查看openssl版本&#xff0c;输入命令&#xff1a;openssl version2.夜神模拟器安装1.1 下载安装1.2工具准备&#xff0c;MT管理…

【Lilishop商城】No4-6.业务逻辑的代码开发,涉及到:接口入参、出参开发逻辑,及POJO的各种总结

仅涉及后端&#xff0c;全部目录看顶部专栏&#xff0c;代码、文档、接口路径在&#xff1a; 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇会结合业务介绍重点设计逻辑&#xff0c;其中重点包括接口类、业务类&#xff0c;具体的结合源代…

完整iOS APP发布App Store上架流程指南

本文章的目的在于教会你如何创建ios的打包证书和如何上架假如你没有任何的打包或上架经验&#xff0c;参考本文有很大的收益。通常创建ios证书和上架&#xff0c;是需要MAC电脑的&#xff0c;本文重点介绍如何在没有mac电脑的情况下&#xff0c;创建mac证书和上架。假如你还没有…

STM32CUBEIDE-简单案例生成

STM32CUBEIDE-简单案例生成 京东链接&#xff1a;https://i-item.jd.com/66584659856.html 生成工程 使用STM32CUBEMX生成例程&#xff0c;这里使用STM32F103C8T6系统板。 新建一个工程&#xff0c;这里有3种新建工程方式。 ● 基于MCU/MPU新建工程 ● 基于ST模块新建工程 ●…

PCB板缺陷检测机器视觉识别算法 yolo

PCB板缺陷检测机器视觉识别算法通过pythonyolo系列网络深度学习模型对PCB电路板外观实时监测&#xff0c;当模型算法监测到有缺陷的PCB板时立即抓拍存档。Python是一种由Guido van Rossum开发的通用编程语言&#xff0c;它很快就变得非常流行&#xff0c;主要是因为它的简单性和…

Vue2进阶笔记

Vue2进阶笔记一、基础知识1.1 computed计算属性1.2 watch监视属性1.3 动态绑定样式1.4 列表循环渲染 key的探讨1.5 列表过滤1.6 数据监视1.7 表单收集1.8 过滤器1.9 生命周期函数1.10 nextTick1.11 动画与过渡1.12 脚手架配置跨域代理二、组件化开发2.1 演替与定义2.2 使用与注…

多线程进阶(一)锁策略,CAS及Synchronized原理

目录 前言&#xff1a; 常见锁策略 CAS CAS应用场景 标准库中基于CAS实现的原子类介绍 代码实现 ABA问题 Synchronized原理 锁升级 锁消除 锁粗化 小结&#xff1a; 前言&#xff1a; 通过这篇文章可以更加深入理解锁内部的一些实现原理&#xff0c;以及怎样描述一…