MyBatis 中的动态 SQL 的相关使用方法

   为什么会有动态SQL,把SQL写死不是比较方便吗?其实有很多的举例,这里我那一个常见的来说,像我们用户注册,会有必填字段和非必填字段,有些传来的参数不一样,那对应的SQL也不一样,因此,在这些的场景底下我们需要使用动态SQL来完成。

  这里动态SQL我是使用XML的办法进行说明,因为使用注解不方便,而且不好观察哪里有误。这里我会先从一些常用的标签的介绍来对动态SQL进行使用的讲解。

1.1 <if>标签

    <insert id="insertByCondition">insert into userinfo(<if test="username != null">username</if><if test="password != null">,password</if><if test="age != null">,age</if><if test="gender != null">,gender</if>) values (<if test="username != null">#{username}</if><if test="password != null">,#{password}</if><if test="age != null">,#{age}</if><if test="gender != null">,#{gender}</if>)</insert>

 

  从上述代码可以简单看出来,<if> 标签是一个<if test = "xxxx">xxxx</if>的结构,然后另一个是运行后的结果,这里发现如果if里面都有值的话,可以完好的插入,但是它就一定没问题吗?下面一个图我就简单注释掉几个来,实验一下。

  从上图可以简单的看错来,它是一个BadSql因为我们注掉了username导致,多了一个逗号那怎么样才能避免上述情况呢?那就要引入新的注解。

1.2<trim> 标签

  这里我们先简单介绍一下<trim>标签里面几个常见的属性:
     1. prefix:表示整个语句块,以prefix的值作为前缀。

     2. suffix:表示整个语句块,以suffix的值作为后缀。

     3. prefixOverrides:表示整个语句块要去除掉前缀。

     4. suffixOverrides:表示整个语句块要去掉后缀。

<insert id="insertByCondition">insert into userinfo<trim prefix="(" suffix=")" prefixOverrides=","><if test="username != null">username</if><if test="password != null">,password</if><if test="gender != null">,gender</if><if test="age != null">,age</if></trim>values<trim prefix="(" suffix=")" prefixOverrides=","><if test="username != null">#{username}</if><if test="password != null">,#{password}</if><if test="gender != null">, #{gender}</if><if test="age != null">,#{age}</if></trim></insert>

  上述因为username是不能为空,因此我把注掉username改为注掉gender,可以发现在<if>标签里面的问题给解决了。

1.3  <where>标签

<select id="queryUserByCondition" resultType="com.jincheng.mybatisdemo.model.UserInfo">select * from userinfo<where><if test="age != null">age = #{age}</if><if test="gender != null">and gender = #{gender}</if><if test="deleteFlag">and delete_flag = #{deleteFlag}</if></where></select>
    <select id="queryUserByCondition" resultType="com.jincheng.mybatisdemo.model.UserInfo">select * from userinfo<trim prefix="where" prefixOverrides="and"><if test="age != null">age = #{age}</if><if test="gender != null">and gender = #{gender}</if><if test="deleteFlag">and delete_flag = #{deleteFlag}</if></trim></select>

  通过上面可以发现第一个是使用<where>标签进行写的,而另一个是通过使用<trim>标签进行写的。可以简单比对一下<where>标签,生成where关键字,并且去除最前面的and 或者 or,如果where标签代码块,没有一个查询条件,会省略掉where关键字。也可以使用<trim prefix="where" prefixOverrides="and">替换,但是这种情况下,子元素没有内容时,where关键字也会保留。

1.4 <set>标签

<update id="updateByCondition">update userinfo<set><if test="password != null">password = #{password},</if><if test="age != null">age = #{age},</if><if test="gender != null">gender = #{gender}</if></set>where id = #{id}</update>

  这里<set>标签,生成set关键字,去掉整个代码块后面的逗号。如果使用<trim prefix="set" suffixOverrides=",">可以进行替换。

1.5 <foreach>标签

  简单来说一下<foreach>标签里面的属性:

      1. collection:绑定方法参数中的集合,如LIst,Set,Map或数组对象

      2. item:遍历是的每一个对象

      3. open:语句块开头的字符串

      4. close:语句块结束的字符串

      5. separator:每次遍历之间间隔的字符串。

一般用在批量删除中等等。

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

1.6 <inlcude>标签

  这个标签用于在xml映射文件中配置的SQL,有时可能会存在很多重复的片段,此时就会在很多多余的代码。

  这里我们需要对重复的代码片段进行抽取,将其通过<sql>标签封装到一个SQL片段,然后通过<include>标签进行引用:

        1.<sql> : 定义可重用的SQL片段

        2. <include>:通过属性refid,指定包含的SQL片段。

    <sql id="selectAll">select * from userinfo</sql><select id="select" resultType="com.jincheng.mybatisdemo.model.UserInfo"><include refid="selectAll"></include></select>

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

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

相关文章

FluentUI系列 - 1 - 介绍第一个窗口

介绍一个QML的UI库&#xff0c;国人编写&#xff0c;作者也耍知乎。这个UI库确实好用&#xff0c;但是教程基本等于无&#xff0c;个人在使用中顺便记录一下学习内容。这玩意儿也有Pyside6的版本&#xff0c;有需要的可以查看PySide6-FluentUI-QML。 FluentUI库地址​github.c…

【MVCC】深入浅出彻底理解MVCC

MVCC概述 MVCC&#xff08;Multi-Version Concurrency Control&#xff09;即多版本并发控制。主要是为了提高数据库的并发性能而提供的&#xff0c;采用了不加锁的方式处理读-写并发冲突&#xff0c;确保了任何时刻的读操作都是非阻塞的。只需要很小的开销&#xff0c;就可以…

ArcGIS Pro 3D建模简明教程

在本文中&#xff0c;我讲述了我最近一直在探索的在 ArcGIS Pro 中设计 3D 模型的过程。 我的目标是尽可能避免与其他软件交互&#xff08;即使是专门用于 3D 建模的软件&#xff09;&#xff0c;并利用 Pro 可以提供的可能性。 这个短暂的旅程分为三个不同的阶段&#xff1a;…

信息系统项目管理师0048:审计内容(3信息系统治理—3.1 IT审计—3.2.4审计内容)

点击查看专栏目录 文章目录 3.2.4审计内容 3.2.4审计内容 IT审计业务和服务通常分为IT内部控制审计和IT专项审计。IT内部控制审计主要包括组织层面IT控制审计、IT一般控制审计及应用控制审计&#xff1b;IT专项审计主要是指根据当前面临的特殊风险或者需求开展的IT审计&#xf…

3、JVM对象的创建于内存分配原理

对象的创建 对象创建的主要流程: 1.类加载检查 虚拟机遇到一条new指令时&#xff0c;首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有&#xff0c;那必须先执行相应的类加…

Go——Goroutine介绍

一. 并发介绍 进程和线程 进程是程序在操作系统中一次执行过程&#xff0c;系统进程资源分配和调度的一个独立单位。线程是进程执行的实体&#xff0c;是CPU调度和分派的基本单位&#xff0c;它是比进程更小的能独立运行的基本单位。一个进程可以创建和撤销多个线程&#xff0c…

【若依前后端分离】首页-多个按钮控制同一个图表

示例图&#xff1a;上面四个框可以点击 重要代码片段 &#xff1a; index_v1中 <panel-group handleSetLineChartData"handleSetLineChartData" :data"totalData"/> : 这是一个自定义的 Vue 组件。名称是 panel-group。handleSetLineChartData"…

WEB3.0:互联网的下一阶段

随着互联网的发展&#xff0c;WEB3.0时代正在逐步到来。本文将深入探讨WEB3.0的定义、特点、技术应用以及未来展望&#xff0c;为读者带来全新的思考。 一、什么是WEB3.0&#xff1f; WEB3.0可以被理解为互联网发展的下一阶段&#xff0c;是当前WEB2.0的升级版。相较于2.0时代…

有哪些软件可以限制应用安装呢?

在限制应用安装方面&#xff0c;有几种方法和工具可供选择&#xff0c;具体取决于你的需求和设备类型。以下是一些常见的方法和软件&#xff1a; 1. **家长控制功能**&#xff1a;操作系统如iOS、Android和Windows等都提供了家长控制功能&#xff0c;允许家长限制特定用户的应…

【go从入门到精通】作用域,包详解

作者简介&#xff1a; 高科&#xff0c;先后在 IBM PlatformComputing从事网格计算&#xff0c;淘米网&#xff0c;网易从事游戏服务器开发&#xff0c;拥有丰富的C&#xff0c;go等语言开发经验&#xff0c;mysql&#xff0c;mongo&#xff0c;redis等数据库&#xff0c;设计模…

性能分析-数据库(安装、索引、sql、执行过程)与磁盘知识(读、写、同时读写、内存速度测试)

数据库 数据库&#xff0c;其实是数据库管理系统dbms。 数据库管理系统&#xff0c; 常见&#xff1a; 关系型数据库&#xff1a; mysql、pg、 库的表&#xff0c;表与表之间有关联关系&#xff1b; 表二维表统一标准的SQL&#xff08;不局限于CRUD&#xff09;非关系型数据…

阿里云9元服务器租用收费价格表_免费云服务器领取

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…

第P2周:CIFAR10彩色图片识别

第P2周&#xff1a;CIFAR10彩色图片识别 &#x1f368; 本文为&#x1f517;365 天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K 同学啊 &#x1f4cc;第P2周&#xff1a;彩色图片识别&#x1f4cc; 难度&#xff1a;小白入门⭐ 语言&#xff1a;Python…

QSFP-DD 和 QSFP+ / QSFP28 / QSFP56 / OSFP / CFP8 / COBO 之间的区别

&#x1f31f;QSFP-DD 作为400G 光模块的最小外形尺寸&#xff0c;提供业界最高的带宽密度&#xff0c;同时利用对低速 QSFP 可插拔模块和电缆的向后兼容性&#xff0c;使其在光纤制造商中很受欢迎。作为400G高速应用中最新的热门光收发器&#xff0c;QSFP-DD经常被拿来与QSFP5…

计算机视觉——DiffYOLO 改进YOLO与扩散模型的抗噪声目标检测

概述 物体检测技术在图像处理和计算机视觉中发挥着重要作用。其中&#xff0c;YOLO 系列等型号因其高性能和高效率而备受关注。然而&#xff0c;在现实生活中&#xff0c;并非所有数据都是高质量的。在低质量数据集中&#xff0c;更难准确检测物体。为了解决这个问题&#xff…

【报错】AttributeError: ‘NoneType‘ object has no attribute ‘pyplot_show‘(已解决)

【报错】AttributeError: ‘NoneType’ object has no attribute ‘pyplot_show’ 问题描述&#xff1a;python可视化出现下面报错 我的原始代码&#xff1a; import matplotlib.pyplot as pltplt.figure() plt.plot(x, y, bo-) plt.axis(equal) plt.xlabel(X) plt.ylabe…

基于LNMP部署wordpress

目录 一.环境准备 二.配置源并安装 三.配置Nginx 四.配置数据库 五.上传源码并替换 六.打开浏览器&#xff0c;输入虚拟机ip访问安装部署 七.扩展增加主题 一.环境准备 centos7虚拟机 关闭防火墙和seliunx stop firewalld #关闭防火墙 setenforce 0 …

软件设计师-基础知识科目-标准化与软件知识产权基本知识11

十一、标准化与软件知识产权基本知识&#xff1a; 知识产权&#xff1a; 主要包括&#xff1a;著作权及邻接权、专利权、工业品外观设计权、商标权、地理标志权、继承电路布图设计权。邻接权是指与著作权相邻近的权利&#xff0c;是指作品传播者&#xff0c;对其传播作品过程…

Unity TextMeshProUGUI 获取文本尺寸·大小

一般使用ContentSizeFitter组件自动变更大小 API 渲染前 Vector2 GetPreferredValues(string text)Vector2 GetPreferredValues(string text, float width, float height)Vector2 GetPreferredValues(float width, float height) 渲染后 Vector2 GetRenderedValues()Vector…

【安全】挖矿木马自助清理手册

一、什么是挖矿木马 挖矿木马会占用CPU进行超频运算&#xff0c;从而占用主机大量的CPU资源&#xff0c;严重影响服务器上的其他应用的正常运行。黑客为了得到更多的算力资源&#xff0c;一般都会对全网进行无差别扫描&#xff0c;同时利用SSH爆破和漏洞利用等手段攻击主机。 …