【MyBatis学习】动态SQL的使用,MyBatis还能这样使用?惊掉了我的下巴 ,赶快带着好奇心一起畅游动态SQL的海洋吧! ! !

news2024/11/17 11:31:33

前言:
大家好,我是良辰丫,今天我们来学习一下MyBatis中动态sql的使用,带着疑惑走进我们今天的学习! ! !💌💌💌

🧑个人主页:良辰针不戳
📖所属专栏:javaEE进阶篇之框架学习
🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。
💦期待大家三连,关注,点赞,收藏。
💌作者能力有限,可能也会出错,欢迎大家指正。
💞愿与君为伴,共探Java汪洋大海。

在这里插入图片描述

目录

  • 1. 初识动态SQL
  • 2. if标签
    • 2.1 原始的插入语句
    • 2.2 加入if的插入数据
  • 3. trim标签
  • 4. where标签
  • 5. set标签
  • 6. foreach标签

1. 初识动态SQL

官方给的动态SQL的概念

  • 动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。
  • 使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。
  • 如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。

链接: 官方动态sql链接描述

通俗来讲,动态sql就是根据不同的条件生成不同的sql语句,本质还是sql语句,只是我们可以在sql层面,去执行一个逻辑代码。动态sql就是在拼接sql语句,我们只要保证sql正确性,按照sql的格式,把各个语句拼接成一个完整的sql语句.

2. if标签

我们想创建一个数据库,注意我们的name属性默认为空串,而不是null.

 create table stu3(id int primary key auto_increment,
  			name varchar(20) default '',
  			age int);

2.1 原始的插入语句

接口方法

    int add(Stu stu);

xml配置

    <insert id="add">
        insert into stu3 values(#{id},#{name},#{age})
    </insert>

单元测试

    @Test
    void add() {
        // 伪代码,构建对象并设置相应的值
        Stu stu = new Stu();
        stu.setAge(21);
        // 调用 mybatis 添加方法执行添加操作
        int result = stuMapper.add(stu);
        System.out.println("添加:" + result);
        Assertions.assertEquals(1, result);
    }
  • 运行之后的数据库信息,我们惊讶的发现我们在测试单元中没有给name设置值,但是却给我们生成了一个null.
  • 虽然我们没有传值,但是它默认给我们执行,传了一个null

在这里插入图片描述

2.2 加入if的插入数据

    <insert id="add">
        insert into stu3(
        id,
        <if test="name != null">
            name,
        </if>
        <if test="age != null">
            age
        </if>
        )
        values(
        #{id},
        <if test="name != null">
            #{name},
        </if>
        #{age})
    </insert>
	 @Test
    void add() {
        // 伪代码,构建对象并设置相应的值
        Stu stu = new Stu();
        stu.setAge(50);
        // 调用 mybatis 添加方法执行添加操作
        int result = stuMapper.add(stu);
        System.out.println("添加:" + result);
        Assertions.assertEquals(1, result);
    }

在这里插入图片描述

  • test后面是一条布尔类型的判断语句.
  • test后面语句为true执行if标签里面的语句,为false时不执行if标签里面的语句.

3. trim标签

之前的插⼊⽤户功能,只是有⼀个 sex 字段可能是选填项,如果所有字段都是⾮必填项,就考虑使⽤
标签结合标签,对多个字段都采取动态⽣成的⽅式。
标签中有如下属性:

  • prefix:表示整个语句块,以prefix的值作为前缀
  • suffix:表示整个语句块,以suffix的值作为后缀
  • prefixOverrides:表示整个语句块要去除掉的前缀
  • suffixOverrides:表示整个语句块要去除掉的后缀
    <insert  id="add">
        insert into stu3
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="name != null">
                name,
            </if>
            <if test="age != null">
                age,
            </if>
        </trim>
        values
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="name != null">
                #{name},
            </if>
            <if test="age != null">
                #{age},
            </if>
        </trim>
    </insert>
    @Test
    void add() {
        // 伪代码,构建对象并设置相应的值
        Stu stu = new Stu();
        //stu.setId(10);
        stu.setName("张三");
        stu.setAge(18);
        // 调用 mybatis 添加方法执行添加操作
        int result = stuMapper.add(stu);
        System.out.println("添加:" + result);
        Assertions.assertEquals(1, result);
    }

在这里插入图片描述

4. where标签

  • where标签里面可以没有数据,没有数据的时候生成的sql语句没有where关键字.
  • where是否存在,where标签会帮我们去判断.利用trim可以实现相同的功能.
  • where标签通常与if标签一起使用.
  • where标签会删除最前面的and关键字,不会删除最后面的and关键字.也就是两个标签里面放两个属性,在sql语句里面需要用and关键字进行连接,这里的and可以放在第一个标签的末尾,也可以放在第二个标签的首部.
    Stu getStuName(@Param("name") String name);
    <select id="getStuName" resultType="com.example.demo.entity.Stu">
        select * from stu3
        <where>
            <if test="name != null">
                name = #{name}
            </if>
        </where>
    </select>
    @Test
    void getStuName() {
        Stu stu = stuMapper.getStuName("张三");
        System.out.println(stu);
    }

在这里插入图片描述

5. set标签

  • set标签经常与if标签一起使用.
  • set标签会自动去处最后一个英文逗号.
    int update(Stu stu);
   <update id="update">
        update stu
        <set>
            <if test="name != null">
                name = #{name},
            </if>
            <if test="age != null">
                age = #{age}
            </if>
        </set>
        where id = #{id}
    </update>
    @Test
    void update() {
        Stu stu = new Stu();
        stu.setId(1);
        stu.setName("李四");
        stu.setAge(18);
        stuMapper.update(stu);
    }

在这里插入图片描述

在这里插入图片描述

注意:
我们上面语句中,age结束语可以加逗号,因为set标签会自动去处最后一个英文逗号.

6. foreach标签

  • 我们在删除数据库的数据信息的时候,可以一条删除语句删除多条数据信息.
  • 在我们后端代码中我们采用集合的方式.

标签的属性:

  • collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象
  • item:遍历时的对象
  • open:语句块开头的字符串
  • close:语句块结束的字符串
  • separator:每次遍历之间间隔的字符串
    int del(List<Integer> ids);
   <delete id="del">
        delete from stu where id in
        <foreach collection="ids" open="(" close=")" item="id" separator=",">
            #{id}
        </foreach>
    </delete>
    @Test
    void del() {
        List<Integer> list = new ArrayList<>();
        list.add(15);
        list.add(16);
        list.add(17);
        stuMapper.del(list);
    }

在这里插入图片描述

后序:
看到这里,想必大家对动态sql有了一定的认识和了解,同时呢,我们的MyBatis到这里也就结束了,再次说明一下哈,MyBatis学习要多操作,其实并不难,多加练习即可.好了,我们下一篇文章再见! ! !🧃🧃🧃

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

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

相关文章

短视频矩阵源码开发部署技术解析

短视频矩阵源码开发涉及到多个方面的技术&#xff0c;包括但不限于以下几点&#xff1a; 抖yinAPI&#xff1a;需要通过API获取抖音的视频、用户、评论、点赞等数据。 抖yinSDK&#xff1a;如果需要开发一些原生的功能&#xff0c;比如分享、登录、支付等&#xff0c;需要使用…

深入解析大型语言模型:从训练到部署大模型

简介 随着数据科学领域的深入发展&#xff0c;大型语言模型—这种能够处理和生成复杂自然语言的精密人工智能系统—逐渐引发了更大的关注。 LLMs是自然语言处理&#xff08;NLP&#xff09;中最令人瞩目的突破之一。这些模型有潜力彻底改变从客服到科学研究等各种行业&#x…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第四天 4/50

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

Jenkins集成Sonar与Gitlab代码质量检测

前提默认 安装docker19&#xff0c;与docker-compose 安装Jenkins 1、docker-compose.yaml配置 version: 3 services: jenkins: #network_mode: "host" #镜像 image: jenkins/jenkins:2.399-jdk11 #容器名称 container_name: jenkins #启动模式 res…

探索uniapp+vue3解析markdown语法|uniapp键盘撑起

最近正在尝试使用uniappvue3开发仿制chatgpt会话功能。 如上图&#xff1a;经过测试在h5/App端/小程序端 均支持markdown语法解析&#xff0c;键盘撑起后&#xff0c;整体页面和顶部自定义导航栏不会被顶起。 uniapp markdown解析及语法高亮 使用了markdown-it和highlight.js…

深入理解深度学习——BERT(Bidirectional Encoder Representations from Transform):输入表示

分类目录&#xff1a;《深入理解深度学习》总目录 BERT在预训练阶段使用了《深入理解深度学习——BERT&#xff08;Bidirectional Encoder Representations from Transform&#xff09;&#xff1a;MLM&#xff08;Masked Language Model&#xff09;》和《深入理解深度学习——…

C++——函数重载

目录 1. 函数重载的概念 2. 函数重载注意点 3. C可以函数重载的原因 4. 总结 1. 函数重载的概念 函数重载:是函数的一种特殊情况。C语言不支持函数重载&#xff0c;而C允许在同一作用域中声明几个功能类似的同名函数&#xff0c;这些同名函数的形参列表(参数个数 或 类型 …

【软件设计师暴击考点】软件工程知识高频考点【一】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件…

基于Springboot+vue的汽车租赁系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

阿里云服务器的可用区和地域选择有哪些考虑因素?如何优化性能?

阿里云服务器的可用区和地域选择有哪些考虑因素&#xff1f;如何优化性能&#xff1f;   选择阿里云服务器时&#xff0c;可用区和地域选择是一个非常关键的环节。本文将为您详细解析在这个过程中需要考虑的因素以及如何优化性能。 一、阿里云服务器的可用区和地域选择的考虑…

PHP基础知识解析:探索PHP编程的核心概念和技巧

目录 PHP简介 什么是PHP 网站基本概念 网站 静态网站特点 动态网站特点 服务器概念 IP 域名 DNS 端口 PHP基础知识 PHP语法 PHP注释 PHP语句分隔符 变量 变量基本概念 变量的使用 命名的命名规则&#xff1a; 预定义变量&#xff1a; 可变变量 变量传值 …

【Linux操作系统】共享内存

文章目录 什么是共享内存&#xff1f;共享内存的原理共享内存的知识点构建创建共享内存的前提-key值共享内存的创建ipcs命令共享内存的释放共享内存的关联与解除代码演示共享内存的大小共享内存的特点 什么是共享内存&#xff1f;共享内存的原理 共享内存让不同进程看到同一份…

C++ --引用与函高级

引用 定义&#xff1a;给变量起别名。 语法&#xff1a;数据类型&别名原名。 int a10; int &ba; //(此时的a和b都指向了同一块空间&#xff0c;都可对里面的元素进行修改) 对这两个变量名字任意一个进行修改&#xff0c;两变量的结果都会发生变化 引用注意事项 1.引…

211大学,4个计算机应届生,真实求职情况~

每年6月&#xff0c;毕业就业是一个绕不开的永恒话题&#xff01;2024届秋招即将开始&#xff0c;你们都找到工作了吗&#xff1f;是否还在犹豫、焦虑、没有头绪…… 先知先觉的那一批人&#xff0c;总会未雨绸缪&#xff0c;从前辈那里汲取经验。 播妞采访了4位211计算机应届…

vue+leaflet笔记之地图放大镜

vueleaflet笔记之地图放大镜 文章目录 vueleaflet笔记之地图放大镜开发环境使用教程安装依赖库使用简介 详细源码(Vue3) 本文介绍了Web端使用 Leaflet开发库显示地图放大镜的方法 (底图来源:中科星图)&#xff0c;结合 leaflet.magnifyingglass插件可以为Leaflet图层添加“放…

SHAP显示原始特征

1.问题描述 SHAP用于特征解释&#xff0c;对于机器学习方法往往需要对原始特征进行编码&#xff0c;而SHAP在绘制单个样本时&#xff0c;会显示每个特征及其取值&#xff0c;而这个取值已经是编码后的&#xff0c;通常无法确定其含义。如&#xff1a; 下图所示的拍卖公司、城市…

【软件设计师暴击考点】数据结构高频考点暴击系列

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件…

MarkDown语法学习 —— LaTex数学公式 数学符号

文章目录 01 | &#x1f6d1; LaTex公式模式02 | &#x1f6a6;上下标符号 & 数学符号03 | &#x1f6a5; 运算符 LaTeX&#xff0c;作为广义上的计算机标记语言&#xff08;比如HTML&#xff09;&#xff0c;它继承了计算机语言的光荣传统&#xff0c;通过一些简单的代码表…

入门防火墙基本原理

防火墙是可信和不可信网络之间的一道屏障&#xff0c;通常用在LAN和WAN之间。它通常放置在转发路径中&#xff0c;目的是让所有数据包都必须由防火墙检查&#xff0c;然后根据策略来决定是丢弃或允许这些数据包通过。例如&#xff1a; 如上图&#xff0c;LAN有一台主机和一台交…

Nginx基础配置以及实操

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、nginx主配置文件1.全局配置2.I/O事件配置3.HTTP配置4.检查文件是否配置正确5.浏览器测试6.总配置文件图示6.1 nginx总配置文件的三个模块6.2 HTTP文件配置的图示…