MyBatis基础之动态SQL

news2025/2/24 9:08:21

在这里插入图片描述

文章目录

  • 动态 SQL
    • if 元素
    • choose-when-otherwise 元素
    • where 元素
    • set 元素
    • foreach 元素

动态 SQL

简而言之,动态 SQL 就是在 Mapper 中使用分支、循环等逻辑。常见的动态 SQL 元素包括:

  • if 元素
  • choose-when-otherwise 元素
  • where 元素
  • set 元素
  • foreach 元素

if 元素

<if> 元素是我们最常见的元素判断语句,相当于 Java 中的 if 语句。它的 test 属性是它的必要属性。

<select id="select" parameterType="int" resultType="Department">
    SELECT * FROM dept
    <if test="deptno != null">
        WHERE deptno = #{deptno}
    </if>
</select>

choose-when-otherwise 元素

MyBatis 并未提供类似 if-else 元素来处理分支情况,if 元素可出现多次,但它们是并列的判断,而非互斥的判断。

<choose> - <when> - <otherwise> 元素类似于 Java 中的 switch-case,用于处理多个条件间的互斥判断。

<select id="selectBySallary" resultType="Employee">
    SELECT * FROM emp
    <choose>
        <when test="min != null and max != null">
            WHERE sal >= #{min} AND sal <= #{max}
        </when>
        <when test="min != null">
            WHERE sal >= #{min} 
        </when>
        <when test="max != null">
            WHERE sal <= #{max}
        </when>
        <otherwise></otherwise>
    </choose>
</select>

where 元素

如果我们强行规定,上述 choose-when-otherwise 所实现的功能必须使用 if 实现,那么将会写成如下形式:

<select id="selectBySallary" resultType="Employee">
    SELECT * FROM emp
    WHERE 1 = 1
    <if test="min != null">
        AND sal >= #{min}
    </if>
    <if test="max != null">
        AND sal <= #{max}
    </if>
</select>

注意体会上面 WHERE 1 = 1 的位置及其作用。

由于判断条件有可能有,也可能没有,所有在 if 元素中,WHERE 关键字出现的地方就有些「尴尬」。WHERE 1 = 1 就是此问题的 非典型 解决方案。

MyBatis 提供了 Where 元素以解决上述尴尬问题。

<select id="selectBySallary" resultType="Employee">
    SELECT * FROM emp
    <where>
        <if test="min != null">
            AND sal >= #{min}
        </if>
        <if test="max != null">
            AND sal <= #{max}
        </if>
    </where>
</select>

set 元素

类似于 where 的元素,set 元素对应于 SQL 语句中的 SET 子句。它专用于 update 语句,用于包含所需更新的列。

set 元素常常和 if 元素联合使用。因为在「选择性更新」功能中,有一个 最后一个逗号 问题。

注意,更新行为务必要保证更新至少一个属性,否则 MyBatis 更新语句提示 update 语句错误

<update id="updateByPrimaryKeySelective" parameterType="Department">
    UPDATE dept
    <set>
        <if test="dname != null"> dname = #{dname}, </if>
        <if test="loc != null"> loc = #{loc}, </if>
    </set>
    WHERE deptno = #{deptno}
</update>

foreach 元素

foreach 元素使用不多,通常两种情况下有可能用到:

  • 构建包含 IN 子句的查询。

    <select id="selectInDeptnos" resultType="Employee">
        SELECT * FROM employee WHERE department_id IN 
        <foreach collection="list" item="cur" open="(" separator="," close=")">
            #{cur}
        </foreach>
    </select>
    

    collection 属性表示集合类型,其属性值可以是 list 或 array,对应参数类型为 List 或 数组。

  • 一条 insert 进行批量添加

    <insert id="insertDepartments" parameterType="list">
        INSERT INTO department(name, location) values 
        <foreach collection="list" item="cur" separator=",">
            ( #{cur.name}, #{cur.location} ) 
        </foreach>
    </insert>
    

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

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

相关文章

2024年中国计量大学MBA最新招生计划公布:有哪些看点?

中国计量大学MBA项目立项于2023年&#xff0c;第一年招生就顺利完成开班任务&#xff0c;虽然人数不多&#xff0c;但是因为其有自身的项目培养定位&#xff0c;因此未来的市场中还是可以保持自身的优势。从2024年最新的招生计划来看&#xff0c;中国计量大学的总体计划依然采取…

大数据-离线项目

第一章 需求分析 需求分析与设计 项目需求背景 "某APP上线后 经营得当 使用户 日活量增多 出现以下问题""营销分析断层&#xff1a;"市场营销成本居高不下&#xff0c;投放拉新的效果追踪出现断层&#xff0c;无法追踪各渠道实际转化率&#xff0c;难以…

应用在摄像头对焦镜头中的马达驱动芯片

摄像头&#xff08;CAMERA或WEBCAM&#xff09;又称为电脑相机、电脑眼、电子眼等&#xff0c;是一种视频输入设备&#xff0c;被广泛的运用于视频会议、远程医疗及实时监控等方面。普通的人也可以彼此通过摄像头在网络进行有影像、有声音的交谈和沟通。另外&#xff0c;人们还…

记录uniapp 微信小程序胶囊分享bug处理 (第一次点击分享的时候不能修改标题或者路径)

问题复现情况: 以下为博主代码&#xff1a; 问题原因: 因为博主的业务需求&#xff0c;需要在分享的时候调用后端的接口来实现分享挂载推广关系。也就是因为调用了接口导致 重新给分享赋值标题或者路径的时候赋值不上。&#xff08;刚开始怀疑是微信分享的问题&#xff0c;后面…

HarmonyOS创作激励计划启动:助力技术创作突破边界

即日起推出HarmonyOS创作激励计划&#xff0c;成功投稿并入选的文章将在HarmonyOS开发者公众号上线&#xff0c;9大技术社区同步宣发&#xff0c;不仅有丰厚稿酬&#xff0c;还有机会赢取创作奖品&#xff01; 活动时间 即日起-2024年12月31日&#xff0c;每季度按照活动规则评…

RabbitMQ 几种模式

一、Hello World 模式 在这一部分中&#xff0c;我们将用 Java 编写两个程序。发送单个消息的生产者和接收消息并打印出来的消费者。模型如下所示&#xff1a; 在下图中&#xff0c;“ P” 是我们的生产者&#xff0c;“ C” 是我们的消费者。中间的框是一个队列 RabbitMQ 代表…

灞桥论“健” 共话康养 灞桥康养论坛取得圆满成功

随着我国“老龄化”的加速&#xff0c;养老资源的匮乏已经成为一个十分严峻的社会问题。同时随着生活水平的大幅提高&#xff0c;康养产业应势而生。涵盖了养老、医疗、体育、养生、旅游等多个领域的康养产业&#xff0c;不仅要为老人们实现“老有所乐、身体健康”的理想&#…

【数据结构】二叉树的前序遍历(七)

题目&#xff1a;二叉树的前序遍历 题目详情&#xff1a;给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历&#xff1b; 我们先来看几个示例&#xff1a; 输入&#xff1a;root [ 1&#xff0c;null&#xff0c;2&#xff0c;3 ] 输出&#xff1a;[ 1&#xf…

【送书】从不了解用户画像,到用画像数据赋能业务看这一本书就够了丨《用户画像:平台构建与业务实践》

文章目录 内容了解本书目录参与方式 &#x1f308;hello&#xff01; 各位铁汁们大家好啊&#xff0c;今天给大家推荐的的是机械工业出版社的 《用户画像&#xff1a;平台构建与业务实践》这本书&#xff01;   ⛳️大数据时代&#xff0c;如何有效地挖掘数据价值并通过画像数…

jvm-sandbox-repeater时间mock插件设计与实现

一、背景 jvm-sandbox-repeater实现了基础的录制回放流程编排&#xff0c;并简单的给了几个插件的demo&#xff0c;离实际项目运用其实还需要二次开发很多东西&#xff0c;其中时间mock能力是一个非常基础的能力&#xff0c;业务代码里经常需要用到这块&#xff1b; 二、调研 …

win10安装kafka,监听9092端口,java调用

1、从Kafka的官网下载Kafka安装包&#xff1a;Apache Kafka 我下的是2.8.0 对应pom.xml配置 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>2.8.0</version> </dependency&…

linux安装配置zeppein

zeppelin是一个让交互式数据分析变得可行的基于网页的开源框架&#xff0c;具有数据分析、数据可视化等功能 一 解压安装包 这里提供了网盘资源 链接: https://pan.baidu.com/s/16pIoHL6ApGAs063cTOUYUg?pwdffq6 提取码: ffq6 下面的是 zeppein 安装包以及&#xff0c;上面的…

【爬虫实战】用python爬今日头条热榜TOP50榜单!

文章目录 一、爬取目标二、爬取结果三、代码讲解四、技术总结五、演示视频六、附完整源码 一、爬取目标 您好&#xff01;我是马哥python说&#xff0c;一名10年程序猿。 今天分享一期爬虫案例&#xff0c;爬取的目标是&#xff1a;今日头条热榜的榜单数据。 打开今日头条首…

月木学途开发 1.后台用户模块

概述 权限控制采用springsecurity 数据库设计 用户表 DROP TABLE IF EXISTS admin; CREATE TABLE admin (aid int(32) NOT NULL AUTO_INCREMENT,email varchar(50) DEFAULT NULL,username varchar(50) DEFAULT NULL,password varchar(255) DEFAULT NULL,phoneNum varchar(2…

日主题RiPro主题高端美化/设计素材软件下载站专用子主题/美化包源码(升级版/免拓展)

主题简介 日主题RiPro主题高端美化/设计素材软件下载站专用子主题/美化包源码&#xff0c;这个子主题美化包无授权无暗链&#xff0c;不用再修改原主题代码&#xff0c;在用这个本美化包前要先下载最新ripro主题&#xff0c;本子主题有版本要求&#xff0c;仅支持RiPro8.0以上…

Api接口加密策略

接口安全要求&#xff1a; 1.防伪装攻击&#xff08;案例&#xff1a;在公共网络环境中&#xff0c;第三方 有意或恶意 的调用我们的接口&#xff09; 2.防篡改攻击&#xff08;案例&#xff1a;在公共网络环境中&#xff0c;请求头/查询字符串/内容 在传输过程被修改&#x…

什么是网络安全?网络安全包括哪几个方面?

提及网络安全&#xff0c;很多人都是既熟悉又陌生&#xff0c;所谓的熟悉就是知道网络安全可以保障网络服务不中断。那么到底什么是网络安全?网络安全包括哪几个方面?通过下文为大家介绍一下。 什么是网络安全? 网络安全是指网络系统的硬件、软件及系统中的数据受到保护&a…

无人直播设置必看:手机自动直播有哪些好处?

随着科技的不断发展&#xff0c;手机直播已经成为了人们生活中不可或缺的一部分。手机自动直播作为一种新兴的技术&#xff0c;为我们的生活带来了诸多便利。本文将从以下几个方面阐述手机自动直播的好处。 首先&#xff0c;手机自动直播可以节省时间和精力。传统的直播方式需…

c 语言开发

目录 IOS 开发&#xff1a;c、swift、object-c 第一节 终端生成.c 文件 ​编辑 第二节 常见的数据类型 第三节 运算符、scanf ​编辑 第四节&#xff1a;如何产生随机数 第五节&#xff1a;while 循环 第六节&#xff1a;goto 第七节&#xff1a;函数 ​编辑 第八节…

中移链交易模块介绍

中移链交易模块是中移链区块链系统的核心模块之一。它的主要作用是处理用户发起的交易请求&#xff0c;并将其打包成区块添加到区块链上。交易模块接收来自不同合约执行的指令&#xff0c;比如创建账号、转账、部署和执行智能合约等指令&#xff0c;并确保所有交易都是有效且合…