MyBatis涉及的动态SQL

动态 SQL 提供了更大的灵活性和可重用性,可以根据不同情况生成不同的 SQL 语句,从而满足应用程序的需求。它简化了数据库操作的编写和管理,提高了开发效率和代码的可维护性。

<if>

用于条件判断,根据条件决定是否包含某个SQL片段。


<!--必填和非必填的<if>标签--><insert id="add2">insert into userinfo(id,<if test="name!=null">name,</if>age) values(#{id},<if test="name!=null">#{name},</if>#{age})</insert>

<trim>

提供了一种灵活的方式来去除或添加 SQL 片段的开头或结尾。

<trim prefix="" suffix="" prefixOverrides="" suffixOverrides="">SQL statement or fragment
</trim>

 

可以看出trim有四个属性

  • prefix,suffix 添加前缀和后缀;
  • prefixOverrides:去掉前缀;suffixOverrides:去掉后缀
   <insert id="add3">insert into userinfo<trim prefix="(" suffix=")" suffixOverrides=","><if test="id!=null">id,</if><if test="name!=null">name,</if><if test="age!=null">age,</if><if test="email!=null">email,</if></trim> values<trim prefix="(" suffix=")" suffixOverrides=","><if test="id!=null">#{id},</if><if test="name!=null">#{name},</if><if test="age!=null">#{age},</if><if test="email!=null">#{email},</if></trim></insert>

<where>

<where>需要搭配<if> 使用;

<where>需要删除前面的and;

<where>语句中没有内容的话就不会生成where sql关键字

 <select id="getListByParam" resultType="com.example.demo1014.entity.UserInfo">select* from userinfo
<!--        <where>-->
<!--            <if test="name!=null">-->
<!--              and  name=#{name}-->
<!--            </if>-->
<!--            <if test="id!=null">-->
<!--              and  id=#{id}--><!--            </if>-->
<!--        </where>--><trim prefix="where" prefixOverrides="and"><if test="name!=null">and name=#{name}</if><if test="id!=null">and id=#{id}</if></trim></select>
    <select id="getListByParam" resultType="com.example.demo1014.entity.UserInfo">select* from userinfo<where><if test="name!=null">and  name=#{name}</if><if test="id!=null">and  id=#{id}</if></where></select>
    <select id="getListByParam" resultType="com.example.demo1014.entity.UserInfo">select* from userinfo<where><if test="name!=null">name=#{name}</if><if test="id!=null">and  id=#{id}</if></where></select>
    @Testvoid getListByParam() {List<UserInfo> list=userMapper.getListByParam("John",1);//select* from userinfo WHERE name=? and id=?List<UserInfo> list1=userMapper.getListByParam("John",null);// select* from userinfo WHERE name=?List<UserInfo> list2=userMapper.getListByParam(null,1);//select* from userinfo WHERE id=?List<UserInfo> list3=userMapper.getListByParam(null,null);//select* from userinfo}

进行单元测试的时候,当输入null参数,if是null的话就没有where后面的sql语句

<set>

<set>用于动态生成 UPDATE 语句的标签。 

在 UPDATE 语句中,我们通常需要根据条件更新表中的某些列。<set> 标签可以帮助我们只更新指定的列,避免全表更新,提高性能和减少网络传输量。

下面是一个使用 <set>标签的示例:

  • 配合if使用;
  • 会自动去除最后一个逗号

<update id="updateUser" parameterType="User">UPDATE user<set><if test="username != null">username = #{username},</if><if test="password != null">password = #{password},</if><if test="email != null">email = #{email},</if></set>WHERE id = #{id}
</update>

在这个示例中,`<set>` 标签包含了多个 `<if>` 标签。每个 `<if>` 标签表示一个条件,如果条件成立,则生成对应的列更新语句。

最终生成的 SQL 语句会根据实际情况只更新存在值的列,而不会更新为 `null` 的列。

需要注意的是,在生成的 SQL 语句中,最后一个列名后面没有逗号,这是通过在 `<if>` 标签中添加逗号来实现的。

<foreach>

item:指定在循环体内每个元素的别名。
index:指定在循环体内每个元素的索引(即下标)。
collection:指定要遍历的集合或数组对象。
open:指定循环体前要添加的字符。
close:指定循环体后要添加的字符。
separator:指定每个元素之间要添加的分隔符。

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

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

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

相关文章

vscode使用code runner乱码

"code-runner.executorMap": {"python": "set PYTHONIOENCODINGutf8 && python $fullFileName"}

【下载器篇】获取微软应用商店应用安装包的方法

【下载器篇】获取微软应用商店应用安装包的方法 微软应用商店历史版本应用下载方法&#xff0c;部分历史版本无法搜索到—【蘇小沐】 文章目录 【下载器篇】获取微软应用商店应用安装包的方法1.实验环境 &#xff08;一&#xff09;微软商店的在线链接生成器1、复制该应用的在…

点云从入门到精通技术详解100篇-基于三维点云的并联机器人 抓取(续)

目录 3 Delta并联机器人3D视觉系统搭建及抓取点计算 3.1 系统总体方案 3.2 Delta并联机器人结构介绍

Django中djangorestframework-simplejwt的使用

发现了一篇很好的文章&#xff0c;上面说的很详细&#xff1a; 链接地址&#xff1a;Django REST Framework教程(7): 如何使用JWT认证(神文多图) - 知乎

机器学习绪论

目录 第1关&#xff1a;什么是机器学习 相关知识 题目答案 第2关&#xff1a;机器学习的常见术语 相关知识 假设空间 归纳偏好 题目答案 第3关&#xff1a;机器学习的主要任务 相关知识 分类 回归 聚类 题目答案 第1关&#xff1a;什么是机器学习 相关知识 相信…

美团二面算法题-输出每对有效括号内的内容;

<!-- 题目&#xff0c;输出每对有效括号内的内容&#xff1b;输入&#xff1a;"(11)*2" 输出&#xff1a;11输入&#xff1a; "((12)*(34))2" 输出&#xff1a;12, 34, (12)*(34)-->function test (str) {let res []let stask []for(let i0;i<…

ASP.NET framework升级core .NET 6.0

C# ASP.NET framework 升级core .NET 6.0 .NET 7.0 .NET 8.0 或者以上 .net framework、.net standard、.net core .net 5/6/7/8 区别_.net 6.0和.net framework的区别-CSDN博客 using System.Web.Http; using HttpPostAttribute Microsoft.AspNetCore.Mvc.HttpPostA…

网络解析(二)

ICMP 报文有很多的类型,不同的类型有不同的代码。最常用的类型是主动请求为 8,主动请求的应答为 0。 ICMP 相当于网络世界的侦察兵。我讲了两种类型的 ICMP 报文,一种是主动探查的查询报文,一种异常报告的差错报文; ping 使用查询报文,Traceroute 使用差错报文。 IP和…

了解主启动类怎么运行

//SpringBootApplication 标注这个类是spring boot的应用&#xff0c;启动类下的所有资源都会被导入 SpringBootApplication public class SpringbootApplication { public static void main(String[] args) { //以为是启动了一个方法&#xff0c;没想到启动了一个服务 SpringA…

ChatGPT技术或加剧钓鱼邮件攻击

我们对ChatGPT这一新技术并不陌生&#xff0c;也早就听闻ChatGPT可以通过某种方式绕过安全机制&#xff0c;对目标进行入侵。 ChatGPT的“越狱”技术已经迭代数次&#xff0c;甚至有了先进的“邪恶GPT”WormGPT和FraudGPT&#xff0c;两者都能快速实现钓鱼邮件骗局。 安全分析…

协同办公系统OA实施过程中需要注意的细节

随着企业对于高效、便捷的办公方式的需求增加&#xff0c;协同办公系统OA正逐渐成为企业信息化建设的热门选择。然而&#xff0c;协同办公系统OA的实施并非一蹴而就&#xff0c;需要企业在实施过程中注意一系列的细节。 一、规划与需求分析 企业应根据自身的业务需求和发展战略…

智能物联网解决方案:蓝牙IOT主控模块打造高效监测和超低功耗

物联网蓝牙模块&#xff0c;无论单模&#xff0c;还是双模&#xff0c;或者双模音频的选择&#xff0c;如下文说描述&#xff1a; 蓝牙芯片模块市场的百花齐放&#xff0c;也带来的工程师在选型时碰到很大的困难&#xff0c;但是无论是做半成品&#xff0c;还是做成品&#xf…

【数字图像处理笔记】01-数字图像基础

01-数字图像基础 图像类型 黑白(二值)图像 只有黑白两种颜色的图像称为黑白图像或单色图像&#xff0c;图像的每个像素只能是黑或白&#xff0c;没有中间的过渡&#xff0c;故又称为二值图像。 二值图像的像素值只能为0或1&#xff0c;图像中的每个像素值用1位存储。图像矩阵中…

钢铁异常分类140篇Trans 学习笔记 小陈读paper

钢铁异常分类 对比学习 比较好用 1.首先&#xff0c;为每个实例生成一对样本&#xff0c; 来自同一实例的样本被认为是正例&#xff0c; 来自不同实例的样本被认为是负例。 2.其次&#xff0c;这些样本被馈送到编码器以获得嵌入。 3.在对比损失[16]的影响下&#xff0c; …

【机器学习】逻辑回归

文章目录 逻辑回归定义损失函数正则化 sklearn里面的逻辑回归多项式逻辑回归 逻辑回归 逻辑回归&#xff0c;是一种名为“回归”的线性分类器&#xff0c;其本质是由线性回归变化而来的&#xff0c;一种广泛使用于分类问题中的广义回归算法。 线性回归是机器学习中最简单的的…

vuex报错[vuex] getters should be function but “getters.doublecount“ in

vuex.esm.js:135 uncaught error: [vuex] getters should be function but “getters.doublecount” in module “user” is 1. 出现这个报错是因为在使用vuex的moulds时 index.js中已经创建了一个vue实例new Vuex.Store&#xff0c;然后在模块文件中又创建了一个&#xff0c;就…

Can We Edit Multimodal Large Language Models?

本文是LLM系列文章&#xff0c;针对《Can We Edit Multimodal Large Language Models?》的翻译。 我们可以编辑多模态大型语言模型吗? 摘要1 引言2 相关工作3 编辑多模态LLM4 实验5 结论 摘要 本文主要研究多模态大语言模型(Multimodal Large Language Models, mllm)的编辑…

单片机TDL的功能、应用与技术特点 | 百能云芯

在现代电子领域中&#xff0c;单片机&#xff08;Microcontroller&#xff09;是一种至关重要的电子元件&#xff0c;广泛应用于各种应用中。TDL&#xff08;Time Division Multiplexing&#xff0c;时分多路复用&#xff09;是一种数据传输技术&#xff0c;结合单片机的应用&a…

【精华系列】跟着Token学习数据挖掘-1

Hello&#xff0c;大家好&#xff01;这里是Token的博客&#xff0c;欢迎您的到来 今天整理的笔记时数据挖掘方向的基础入门&#xff0c;了解数据分析使用的一些基础的Python库&#xff0c;为后面的数据处理做好准备 01-数据分析工具介绍 准备&#xff1a;Python的安装、平台搭…

二叉树的创建和遍历

之前我们在学习二叉树的遍历的时候都是先手动创建出一个二叉树&#xff0c;然后再前中后序的遍历&#xff0c; 但实际中&#xff0c;是给你一个数组里面存的数&#xff0c;然后把他以&#xff08;前中后&#xff09;的遍历储存创建为一个二叉树 思路&#xff1a; 想要创建二叉树…