MyBatis基础之动态SQL

2023-09-20 14:14:42

在这里插入图片描述

动态 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>
    
更多推荐

DETR:End-to-End Object Detection with Transformers

代码:https://github.com/HuKai97/detr-annotations论文:https://arxiv.org/pdf/2005.12872.pdf参考视频:DETR论文精读【论文精读】_哔哩哔哩_bilibili团队:MetaAI摘要DETR做目标检测任务既不需要proposal,也不需要anc

《动手学深度学习 Pytorch版》 6.2 图像卷积

importtorchfromtorchimportnnfromd2limporttorchasd2l6.2.1互相关计算X=torch.tensor([[0.0,1.0,2.0],[3.0,4.0,5.0],[6.0,7.0,8.0]])K=torch.tensor([[0.0,1.0],[2.0,3.0]])此处应

kubeadm部署k8sv1.24使用cri-docker做为CRI

目的测试使用cri-docker做为containerd和docker的中间层垫片。规划IP系统主机名10.0.6.5ubuntu22.04.3jammymaster01.kktb.org10.0.6.6ubuntu22.04.3jammymaster02.kktb.org10.0.6.7ubuntu22.04.3ja

校园闲置物品交易平台的Android设计与实现

目录1引言11.1研究背景及意义11.2研究现状12相关理论及技术介绍32.1相关理论介绍32.2配置系统开发环境33总体设计53.1课题内容与功能设计53.2系统模块设计54软件分析74.1系统概要设计74.1.1系统流程图74.1.2系统整体框架图94.2系统功能设计104.2.1首页管理模块104.2.2个人中心

2560. 打家劫舍 IV

沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。由于相邻的房屋装有相互连通的防盗系统,所以小偷不会窃取相邻的房屋。小偷的窃取能力定义为他在窃取过程中能从单间房屋中窃取的最大金额。给你一个整数数组nums表示每间房屋存放的现金金额。形式上,从左起第i间房屋中放有nums[i]美元

Docker文档阅读笔记-How to Commit Changes to a Docker Image with Examples

介绍在工作中使用Docker镜像和容器,用得最多的就是如何提交修改过的Docker镜像。当提交修改后,就会在原有的镜像上创建一个新的镜像。本博文说明如何提交一个新的Docker镜像。前提①有一个可以直接访问服务器的运行终端;②帐号需要root权限;③已经安装并且配置好了docker手把手教提交修改后的Docker镜像s

【Godot】解决游戏中的孤立/孤儿节点及分析器性能问题的分析处理

Godot4.1因为我在游戏中发现,越运行游戏变得越来越卡,当你使用Node节点中的print_orphan_nodes()方法打印信息的时候,会出现如下的孤儿节点信息孤儿节点信息是以节点实例ID-StrayNode:节点名称(Type:节点类型)作为格式输出,可以多运行几次查看是否节点实例ID是否是相同的,通常不是随

LeNet-5

目录一、知识点二、代码三、查看卷积层的featuremap1.查看每层信息​2.show_featureMap.py背景:LeNet-5是一个经典的CNN,由YannLeCun在1998年提出,旨在解决手写数字识别问题。一、知识点1.iter()+next()iter():返回迭代器next():使用next()来获取

【Python】json 格式转换 ② ( Json 格式简介 | Json 概念 | Json 功能 | 对象 / 数组 格式 | 嵌套格式 | Json 特点 )

文章目录一、Json格式简介1、Json概念2、Json功能3、Json格式-对象/数组格式4、Json格式-对象/数组嵌套格式5、Json特点一、Json格式简介1、Json概念Json的英文全称为"JavaScriptObjectNotation",JavaScript对象符号;Json是轻量级数据交换格式;Jso

【Python】json 格式转换 ① ( json 模块使用 | 列表转 json | json 转列表 | 字典转 json | json 转字典 )

文章目录一、json格式转换1、json模块使用2、代码示例分析-列表转json3、代码示例分析-字典转jsonjson格式字符串与Python中的字典dict和列表list变量可以无缝转换;调用json.dumps函数可以将Python列表/字典转为json;调用json.loads函数,可以将json转为pytho

SQL 性能优化总结

文章目录一、性能优化策略二、索引创建规则三、查询优化总结一、性能优化策略1.SQL语句中IN包含的值不应过多MySQL将IN中的常量全部存储在一个排好序的数组里面,但是如果数值较多,产生的消耗也是比较大的。所以对于连续的数值,能用between就不要用in。2.SELECT语句务必指明字段名称SELECT*增加很多不必

热文推荐