Java_Mybatis_动态SQL

news2024/12/25 8:55:38

一、动态SQL

1.概述

  • 动态SQL: 是 MyBatis 的强大特性之一,解决拼接动态SQL时候的难题,提高开发效率
  • 分类
    • if
    • choose(when,otherwise)
    • trim(where,set)
    • foreach

2.if

  • 做 where 语句后面条件查询的,if 语句是可以拼接多条

  • 需求:根据学生name 做模糊查询

  • 代码

    • mapper.xml

      <select id="selectLikeName" resultType="cn.sycoder.domain.Student">
              select id,name,age
              from student
              where age = 19
              <if test="name != null">
                  and name like concat(#{name},'%')
              </if>
      </select>
      
    • java 代码

       List<Student> selectLikeName(String name);
      

      在这里插入图片描述

3.choose、when、otherwise

  • 概述:不想使用所有条件时候,他们可以从多个条件中选择一个使用,相当于java 的 if … else if … else

  • 需求:按年龄19查找,如果id 不空按id 查找,名字不空按名字查找,否则按班级id 查找

    • mapper.xml

      <select id="selectChoose" resultType="cn.sycoder.domain.Student">
              select <include refid="baseSql"/>
              from student
              where age = 19
              <choose>
                  <when test="id != null">
                      and id = #{id}
                  </when>
                  <when test="name != null">
                      and name like concat(#{name},'%')
                  </when>
                  <otherwise>
                      and class_id = #{clsId}
                  </otherwise>
              </choose>
          </select>
      
    • mapper

      List<Student> selectChoose(@Param("id") Long id,@Param("name")String name
                  ,@Param("clsId") Long clsId);
      
    • 传入 id 参数

      在这里插入图片描述

    • 不传 id 参数,传入name = ‘z’

      在这里插入图片描述

    • 不传入 id 参数和 name 参数

      在这里插入图片描述

4.trim、where、set

4.1trim

  • trim : 用于去掉或者添加标签中的内容

  • prefix:可以在 trim 标签内容前面添加内容

    在这里插入图片描述

  • prefixOverrides:可以覆盖前面的某些内容

    在这里插入图片描述

  • suffix:在 trim 标签后面添加内容

    在这里插入图片描述

  • suffixOverrides:去掉 trim 标签内容最后面的值

    在这里插入图片描述

4.2where

  • where 后面直接跟 if

    在这里插入图片描述

  • age null

    在这里插入图片描述

  • 使用了 where 标签之后,解决了这些问题

    在这里插入图片描述

4.3set

  • set:set 元素可以用于动态包含需要更新的列

  • mapper.xml

    <update id="updateSet">
            update student
            <set>
                <if test="name != null">
                    name = #{name},
                </if>
                <if test="age != null">
                    age = #{age},
                </if>
            </set>
            <where>
                <if test="id != null">
                    id = #{id}
                </if>
            </where>
        </update>
    
    void updateSet(@Param("age") Integer age,@Param("name")String name
                ,@Param("clsId") Long clsId,@Param("id")Long id);
    

    在这里插入图片描述

5.foreach

  • foreach :用于对集合遍历。 动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)

  • 查询 id 在 1,3,4 之间的学生信息

  • mapper.xml

    <select id="selectForeach" resultType="cn.sycoder.domain.Student">
            select * from student
            <where>
                <foreach collection="ids"  item="id" index="i" open="id in(" close=")" separator=",">
                    #{id}
                </foreach>
            </where>
        </select>
    
    List<Student> selectForeach(@Param("ids") List<Long> ids);
    

    在这里插入图片描述

    在这里插入图片描述

    • collection:传参的数组集合
    • item:遍历拿到的每一个元素
    • index:索引
    • open : foreach 标签内容的开始符
    • close : foreach 标签内容的结束符
    • separator:分隔符
    • 取值取的就是 item 的元素值
    • 注意:当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。

6.script

  • script:要在带注解的映射器接口类中使用动态 SQL,可以使用 script 元素。

  • 使用注解操作 mybatis

  • 需求:查询所有的学生信息,用注解方式实现

    @Select("select * from student")
        List<Student> selectAll();
    
  • 更新学生信息,使用 script 标签

    @Update({
                "<script>",
                "update student",
                "  <set>",
                "    <if test='name != null'>name=#{name},</if>",
                "    <if test='age != null'>age=#{age},</if>",
                "    <if test='clsId != null'>class_id=#{clsId},</if>",
                "  </set>",
                "where id=#{id}",
                "</script>"
        })
        void updateStu(@Param("age") Integer age,@Param("name")String name
                ,@Param("clsId") Long clsId,@Param("id")Long id);
    

7.bind

  • bind 元素允许你在 OGNL 表达式以外创建一个变量,并将其绑定到当前的上下文。

  • 需求:通过用户name 进行模糊查询

    <select id="listLike" resultType="cn.sycoder.domain.Student">
            <bind name="ret" value="'%' + name + '%'"/>
            select * from student
            where name like #{ret}
        </select>
    

    在这里插入图片描述

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

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

相关文章

B站内容新爆点 | 高效引流、吸睛利器

11月29日&#xff0c;B站官方发布了2023年第三季度财报。财报显示&#xff0c;B站平台月均活跃用户数从第二季度3.24亿增长至3.41亿&#xff0c;再创新高&#xff0c;日均活跃用户数则突破一亿里程碑&#xff0c;达1.03亿&#xff0c;同比增长14%。用户日均使用时长首次超过100…

Java - Collectors.toMap() 使用

List 转 Map 一、Collectors.toMap() 函数源码定义&#xff1a; // 两个参数public static <T, K, U>Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,Function<? super T, ? extends U> valueMapper) {retu…

【数据结构】贪心算法

一.贪心算法的定义 贪心算法是指在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;只做出在某种意义上的局部最优解。 贪心算法的结果是最优解的最好近似。 优点&#xff1a;简单&#xff0c;高效。 缺点&…

慎用,Mybatis-Plus这个方法可能导致死锁

1 场景还原 1.1 版本信息 MySQL版本&#xff1a;5.6.36-82.1-log Mybatis-Plus的starter版本&#xff1a;3.3.2 存储引擎&#xff1a;InnoDB1.2 死锁现象 A同学在生产环境使用了Mybatis-Plus提供的 com.baomidou.mybatisplus.extension.service.IService#saveOrUpdate(T, co…

【MySQL】:表的约束(上)

表的约束 一.非空约束二.default约束三.列描述四.zerofill五.主键1.单个主键2.复合主键 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保证数据的正确性。比如有…

孩子还是有一颗网安梦——Bandit通关教程:Level 11 → Level 12

&#x1f575;️‍♂️ 专栏《解密游戏-Bandit》 &#x1f310; 游戏官网&#xff1a; Bandit游戏 &#x1f3ae; 游戏简介&#xff1a; Bandit游戏专为网络安全初学者设计&#xff0c;通过一系列级别挑战玩家&#xff0c;从Level0开始&#xff0c;逐步学习基础命令行和安全概念…

随机变量的定义

试验E的样本空间为S&#xff0c;样本空间S中的元素记为e&#xff0c;即样本点是e&#xff0c;样本空间记成&#xff0c;表示元素组成的集合。 随机变量的定义&#xff1a;设随机变量的样本空间为&#xff0c;是定义在样本空间S上的实值单值函数&#xff0c;称为随机变量。 随机…

螺旋矩阵算法(leetcode第54题)

题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。示例 1&#xff1a;输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a;输入&#xff…

《深入理解 Android ART 虚拟机》笔记

Dex文件格式、指令码 一个Class文件对应一个Java源码文件&#xff0c;而一个Dex文件可对应多个Java源码文件。开发者开发一个Java模块&#xff08;不管是Jar包还是Apk&#xff09;时&#xff1a; 在PC平台上&#xff0c;该模块包含的每一个Java源码文件都会对应生成一个同文件…

蝴蝶Butterfly 数据集VOC+yolo-2000张(labelImg标注)

蝴蝶被誉为“会飞的花朵”&#xff0c;是一类非常美丽的昆虫。蝴蝶大多数体型属于中型至大型&#xff0c;翅展在15~260毫米之间&#xff0c;有2对膜质的翅。体躯长圆柱形&#xff0c;分为头、胸、腹三部分。体及翅膜上覆有鳞片及毛&#xff0c;形成各种色彩斑纹。今天要介绍的是…

Mistral AI 推出高质量的稀疏专家混合AI人工智能模型——SMoE,有望超越ChatGPT3.5

Mistral AI&#xff08;“Mistral AI”是一家由前DeepMind和Meta Platforms&#xff08;META.US&#xff09;的研究人员组建的新公司。&#xff09;继续履行为开发者社区提供最佳开放模型的使命。他们发布了 Mixtral 8x7B&#xff0c;这是一个高质量的稀疏专家混合模型&#xf…

YOLOv8改进 | 2023主干篇 | 替换LSKNet遥感目标检测主干 (附代码+修改教程+结构讲解)

一、本文介绍 本文给大家带来的改进内容是LSKNet&#xff08;Large Kernel Selection, LK Selection&#xff09;&#xff0c;其是一种专为遥感目标检测设计的网络架构&#xff0c;其核心思想是动态调整其大的空间感受野&#xff0c;以更好地捕捉遥感场景中不同对象的范围上下…

【精选】SpringMVC简介及其执行流程,参数获取方式

SpringMVC简介 MVC模型 MVC全称Model View Controller&#xff0c;是一种设计创建Web应用程序的模式。这三个单词分别代表Web应用程序的三个部分&#xff1a; Model&#xff08;模型&#xff09;&#xff1a;指数据模型。用于存储数据以及处理用户请求的业务逻辑。在Web应用中&…

37.分支结构嵌套

目录 一.什么是分支结构嵌套 二.什么情况下会用分支结构嵌套 三.举例 四.注意事项 五.视频教程 一.什么是分支结构嵌套 在一个if语句中又包含了另外一个if语句&#xff0c;这种情况称之为if语句的嵌套&#xff0c;也叫做分支结构嵌套。 二.什么情况下会用分支结构嵌套 如…

dToF直方图之美_激光雷达多目标检测

直方图提供了一种简单有效的方法来分析信号分布并识别与目标存在相对应的峰值,并且能够可视化大量数据,让测距数形结合。在车载激光雷达中,对于多目标检测,多峰算法统计等,有着区别于摄像头以及其他雷达方案的天然优势。 如下图,当中有着清晰可见的三个峰值,我们可以非…

炸弹人游戏

代码实现 广度优先搜素 深度优先搜索

巧用RTL原语实现MUX门级映射

对于前端设计人员&#xff0c;经常会需要一个MUX来对工作模式&#xff0c;数据路径进行明确&#xff08;explicit&#xff09;的声明&#xff0c;这个对于中后端工程师下约束也很重要。这里介绍一种巧用的RTL原语&#xff0c;实现MUX的方法。闲言少叙&#xff0c;ICerGo&#x…

2023自动化测试框架大对比:哪个更胜一筹?

所谓工欲善其事&#xff0c;必先利其器&#xff0c;在进行自动化测试时&#xff0c;选择一个合适的框架是至关重要的。因为一个好的测试框架可以大大提高测试效率&#xff0c;减少我们很多工作量。在选择框架之前&#xff0c;我们通常需要对不同的框架进行对比&#xff0c;以便…

Python特征工程神器:Feature Engine库详解与实战

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 特征工程是机器学习中至关重要的一环&#xff0c;而Feature Engine库作为Python中的强大特征工程工具&#xff0c;提供了丰富的功能和灵活的操作。本文将深入探讨Feature Engine的各种特性&#xff0c;包括缺失值…

Trace 在多线程异步体系下传递

JAVA 线程异步常见的实现方式有&#xff1a; new ThreadExecutorService 当然还有其他的&#xff0c;比如fork-join&#xff0c;这些下文会有提及&#xff0c;下面主要针对这两种场景结合 DDTrace 和 Springboot 下进行实践。 引入 DDTrace sdk <properties><java.…