【Mybatis】动态 SQL

news2024/11/17 1:35:24

动态 SQL

  • \<if>标签
  • \<trim>标签
  • \<where>标签
  • \<set>标签
  • \<foreach>标签

动态 sql 是 Mybatis 的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接。

<if>标签

前端用户输入时有些选项是非必填的, 那么此时传到后端的参数是不确定的, 比如:
在这里插入图片描述

那如果在添加⽤户的时候有不确定的字段传⼊,程序应该如何实现呢?

这个时候就需要使⽤动态标签 来判断了,⽐如添加的时候性别 country 和 city 为⾮必填字段,具体实现如下:

    <insert id="insert" parameterType="com.example.springboot3.model.User">
        insert into userinfo (
              username, phone, email,
              <if test="country != null">
                    country,
              </if>
              <if test="city != null">
                    city,
              </if>
        ) values (
              #{username},#{phone}, #{email},
              <if test="country != null">
                    #{country},
              </if>
              <if test="city != null">
                    #{city},
              </if>
        )
    </insert>

在这里插入图片描述

这样当 test 中判断结果为 true 时才会拼接上去.

<trim>标签

上面的插⼊⽤户功能,country 和 city 是选填项,如果所有字段都是选填项,就考虑使⽤ <trim> 标签结合 <if> 标签,对多个字段都采取动态⽣成的⽅式。

<trim>标签中有如下属性:

  • prefix:表示整个语句块,以prefix的值作为前缀
  • suffix:表示整个语句块,以suffix的值作为后缀
  • prefixOverrides:表示整个语句块要去除掉的前缀
  • suffixOverrides:表示整个语句块要去除掉的后缀
    <insert id="insert" parameterType="com.example.springboot3.model.User">
        insert into userinfo
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="username != null">
                username,
            </if>
            <if test="phone != null">
                phone,
            </if>
            <if test="email != null">
                email,
            </if>
            <if test="country != null">
                country,
            </if>
            <if test="city != null">
                city,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="username != null">
                #{username},
            </if>
            <if test="phone != null">
                #{phone},
            </if>
            <if test="email != null">
                #{email},
            </if>
            <if test="country != null">
                #{country},
            </if>
            <if test="city != null">
                #{city},
            </if>
        </trim>
    </insert>

在以上 sql 动态解析时,会对 <trim> 部分做如下处理:

  • 基于 prefix 配置,开始部分加上 (
  • 第二个 <trim> 开始部分会加上 values (
  • 基于 suffix 配置,结束部分加上 )
  • 多个 <if> 组织的语句都以 , 结尾,在最后拼接好的字符串还会以 , 结尾,会基于 suffixOverrides 配置去掉最后⼀个 ,

<where>标签

主要作用: 实现查询中的 where 替换, 可以实现无条件查询.
若存在查询条件会生成 where 的 sql 查询, 并且 where 标签可以去除最前面的 and
如果 where 中的所有参数为空, 那么 where 的 sql 就不会生成, 直接就是无条件查询

比如根据 国家(地区) 或者城市进行搜索, 根据属性做 where 条件查询,国家(地区) 或者城市不为 null 的,作为查询条件。

UserMapper 接口中的方法:

List<User> selectByCondition(String country, String city);

UserMapper.xml 中的实现:

    <select id="selectByCondition" resultType="com.example.springboot3.model.User">
        select * from userinfo
        <where>
            <if test="country != null">
                and country=#{country}
            </if>
            <if test="city != null">
                and city=#{city}
            </if>
        </where>
    </select>

在这里插入图片描述

以上<where>标签也可以使⽤ <trim prefix=“where” prefixOverrides=“and”> 替换。

<set>标签

主要作用: 进行修改操作时, 配合 if 处理非必须传输的参数, 特点是自动去除最后一个 ,

根据传⼊的⽤户对象属性来更新⽤户数据,可以使⽤标签来指定动态内容。

UserMapper 接口中的方法:

int updateById(User user);

UserMapper.xml 中的实现:

    <update id="updateById">
        update userinfo
        <set>
            <if test="username != null">
                username=#{username},
            </if>
            <if test="phone != null">
                phone=#{phone},
            </if>
            <if test="email != null">
                email=#{email},
            </if>
            <if test="country != null">
                country=#{country},
            </if>
            <if test="city != null">
                city=#{city},
            </if>
        </set>
        where id=#{id}
    </update>

<set>标签也可以使⽤ <trim prefix=“set” suffixOverrides=“,”> 替换。

<foreach>标签

对集合进⾏遍历时可以使⽤该标签。

<foreach>标签有如下属性:

  • collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象
  • item:遍历时的每⼀个对象
  • open:语句块开头的字符串
  • close:语句块结束的字符串
  • separator:每次遍历之间间隔的字符串

比如根据用户 id 删除用户:

UserMapper 接口中的方法:

int deleteByIds(List<Integer> ids);

UserMapper.xml 中的实现:

    <delete id="deleteByIds">
        delete from userinfo where id in
        <foreach collection="ids" open="(" item="item" close=")" separator=",">
            #{item}
        </foreach>
    </delete>

好啦! 以上就是对 Mybatis 动态 SQL 的讲解,希望能帮到你 !
评论区欢迎指正 !

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

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

相关文章

面试总结(mysql定精度/oom排查/spring三级缓存/stream流)

Mysql数据类型上的一个把握 1、MySQL Decimal为什么不会丢失精度 DECIMAL的存储方式和其他数据类型都不同&#xff0c;它是以字符串形式存储的。假设一个字段为DECIMAL(3,0)&#xff0c;当我们存入100时&#xff0c;实际上存入的1、0、0这三个字符拼接而成的字符串的二进制值&…

Linux 基本指令(下)

时间相关的指令 date显示 date 指定格式显示时间&#xff1a; date %Y:%m:%d date 用法&#xff1a;date [OPTION]... [FORMAT] 1.在显示方面&#xff0c;使用者可以设定欲显示的格式&#xff0c;格式设定为一个加号后接数个标记&#xff0c;其中常用的标记列表如下 %…

1010hw

using namespace std; class Per {friend const Per operator-(const Per &L,const Per &R);friend bool operator<(const Per &L,const Per &R);int a;int b; public://有参构造Per(int a,int b):a(a),b(b){}//无参构造Per(){}//运算符重载const Per opera…

MyBatis注解开发实现学生管理页面(分页pagehelper,多条件搜索,查看课程信息)

pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

【论文阅读】面向抽取和理解基于Transformer的自动作文评分模型的隐式评价标准(实验结果部分)

方法 结果 在这一部分&#xff0c;我们展示对于每个模型比较的聚合的统计分析当涉及到计算特征和独立的特征组&#xff08;表格1&#xff09;&#xff0c;抽取功能组和对齐重要功能组&#xff08;表格2&#xff09;&#xff0c;并且最后&#xff0c;我们提供从模型比较&#x…

【前端工程化】配置React+ts企业级代码规范及样式格式和git提交规范

目录 前言 代码规范技术栈 创建react18vite2ts项目 editorconfig统一编辑器配置 prettier自动格式化代码 eslintlint-staged检测代码 使用tsc检测类型和报错 代码提交时使用husky检测代码语法规范 代码提交时使用husky检测commit备注规范 配置commitizen方便添加commi…

VMware centos7虚拟机修改静态IP

一、修改网络适配器 1、打开 2、使用管理员权限修改 3、按照图中步骤修改为 4、设置网关为10.0.0.2后保存即可 二、修改配置文件 1、输入下面代码进入修改&#xff08;网卡这里网卡名字为ens33&#xff0c;可使用ifcfig或ip a查看&#xff09; vi /etc/sysconfig/netwo…

【Java 进阶篇】CSS 选择器详解

CSS&#xff08;层叠样式表&#xff09;是一种用于描述网页上元素样式的语言。要想有效地使用CSS&#xff0c;了解CSS选择器是至关重要的&#xff0c;因为它们允许你选择要应用样式的HTML元素。在本文中&#xff0c;我们将详细介绍CSS选择器的各种类型和用法&#xff0c;以便你…

并不止于表面理论和简单示例——《Python数据科学项目实战》

Python 现在可以说是运用最广泛的编程语言之一&#xff0c;使用 Python 的人不只局限在计算机相关专业的从业者,很多来自金融领域、医疗领域以及其他我们无法想象的领域的人,每天都在使用 Python处理各种数据、使用机器学习进行预测以及完成各种有趣的工作。 长久以来&#xff…

济南建筑模板生产厂家有哪些?

在济南地区&#xff0c;寻找一家可靠的建筑模板供应商对于建筑施工企业来说是至关重要的。在众多的厂家中&#xff0c;广西贵港市能强优品木业是济南地区建筑模板最具实力的供应商之一。他们不仅提供高质量的建筑模板&#xff0c;还能提供整车物流包运输&#xff0c;并将货物发…

android app开发环境搭建

Android是流行的移动设备原生应用开发平台&#xff0c;其支持Java语言以及Kotlin语言的开发环境&#xff0c;本文主要描述官方提供的Android studio集成开发环境搭建。 https://developer.android.google.cn/ 如上所示&#xff0c;从官方上下载最新版本的Android studio集成开…

C++ 修改文件创建时间、修改时间属性

简介 修改文件创建时间、修改时间、大小等属性。 博客 《C 获取文件创建时间、修改时间、大小等属性》分享后&#xff0c;好兄弟“古月”发来一段代码&#xff0c;说可以修改文件的创建时间等。测试了一下真可以&#xff0c;下面是运行效果和代码&#xff1a; 代码 #i…

mysql面试题35:MySQL有关权限的表有哪些?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:MySQL有关权限的表有哪些? MySQL中与权限相关的表主要包括以下几个: user表:存储MySQL用户的基本信息,包括用户名、密码等。可以使用以下命令…

用于物体识别和跟踪的下游任务自监督学习-2-背景

2.1用于现实世界应用的计算机视觉的基本概念 有许多中间步骤涉及应用计算机视觉算法来解决现实世界中的问题。机器视觉算法从光学传感器的图像采集开始,并最终解决现实世界的决策任务,如自动驾驶汽车、机器人自动化和监控。设计现代计算机视觉算法包括传感器数据编码、解码、…

Practical Memory Leak Detection using Guarded Value-Flow Analysis 论文阅读

本文于 2007 年投稿于 ACM-SIGPLAN 会议1。 概述 指针在代码编写过程中可能出现以下两种问题&#xff1a; 存在一条执行路径&#xff0c;指针未成功释放&#xff08;内存泄漏&#xff09;&#xff0c;如下面代码中注释部分所表明的&#xff1a; int foo() {int *p malloc(4 …

PointRend: 将图像分割视为渲染——PointRend:Image Segmentation as Rendering

0.摘要 我们提出了一种新的方法&#xff0c;用于高效、高质量的对象和场景图像分割。通过将经典的计算机图形学方法与像素标记任务中面临的过采样和欠采样挑战进行类比&#xff0c;我们开发了一种将图像分割视为渲染问题的独特视角。基于这个视角&#xff0c;我们提出了PointRe…

昂首资本通过套期保值,MT4和MT5这样选

对冲模式允许交易者为一项资产开立任意数量的头寸&#xff0c;但只能进行多单交易&#xff0c;无法改变开仓的成交量。 套期保值系统由MT4和MT5两款软件提供支持&#xff0c;自2016年起&#xff0c;套期保值系统由MT5取代了MT4。净额结算模式允许交易者一次只有一个金融工具的…

TensorRT的结构

Builder&#xff08;网络原数据&#xff09;&#xff1a;模型搭建的入口&#xff0c;网络的tensorRT内部表示以及可执行程序引擎都是由该对象的成员方法生成的 BuiderConfig&#xff08;网络原数据的选项&#xff09;&#xff1a;负责设置模型的一些参数&#xff0c;如是否开始…

R语言R包详解——stringr包:字符处理

R语言 R语言R包详解——stringr包&#xff1a;字符处理 一切用法皆以说明书为准&#xff0c;想要了解该包&#xff0c;请多查阅说明书或者查看底层算法。 文章目录 R语言一、安装与加载R包二、函数简介三、函数详解3.1、str_c: 字符串拼接3.2、str_trim: 去掉字符串的空格和TA…

2核4G服务器支持多少用户同时在线访问?卡不卡?

腾讯云轻量2核4G5M带宽服务器支持多少人在线访问&#xff1f;5M带宽下载速度峰值可达640KB/秒&#xff0c;阿腾云以搭建网站为例&#xff0c;假设优化后平均大小为60KB&#xff0c;则5M带宽可支撑10个用户同时在1秒内打开网站&#xff0c;从CPU内存的角度&#xff0c;网站程序效…