Java_Mybatis_动态SQL

2023-12-16

一、动态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>
    

    在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java_Mybatis_动态SQL 的相关文章

  • 如何使用sql作为xml路径('')但保留回车符

    我有下面的代码 select select cast Narrative as Varchar max char 13 from officeclientledger where ptmatter matter and ptTrans 4
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 将表数据从一个 SQL Server 导出到另一台 SQL Server

    我有两个 SQL Server 都是 2005 版本 我想将多个表从一个表迁移到另一个表 我努力了 在源服务器上 我右键单击数据库 选择Tasks Generate scripts 问题是在下面Table View options没有Scr
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • SQL Server 上的语法错误

    这可能是一个愚蠢的语法错误 但我只是继续阅读我的程序 但我无法弄清楚我的错误在哪里 消息 156 第 15 级 状态 1 第 41 行关键字附近的语法不正确 为了 这是我的代码 alter procedure LockReservation
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List

随机推荐

  • 面试想拿 10K,HR 说你只值 7K,该怎样回答或者反驳?

    傲韦科技二面 拷打项目30分钟 随便聊20分钟1 shardingsphere是什么 怎么用的 分片键如何选择的 电话关联表和邮箱关联表为什么要分开搞 敏感信息加密存储 实 题目解析 题目描述 给出一个矩阵 求出其中的最大值及所在的行号和列
  • 题解|#E. Sending a Sequence Over the Network# cf round 826

    入职半年 成长颇多 秋招逃兵 2020秋招面经大汇总 旷视 回暖分析 战绩结算 on 赛文X 体制内离职 奔赴下一场山海 拒了华为 重回0 offer 体制内离职 奔赴下一场山海 拒了华为 重回0 offer 找实习需要实习经历 应届生谨慎
  • 龙蜥位列用户意愿迁移系统首位,中国操作系统要敢于“亮剑”

    让前路 起后浪 迷茫过 怀疑过 跌倒过 熄不灭 眼中的光 摘自歌曲 行者为光 就像歌中所唱 国内操作系统的演进虽然是夹缝中求生存 却始终前赴后继 矢志不渝 从而逐步实现替代甚至跃升的过程 曾经占据市场主流的CentOS停服 像是一个信号 一
  • CN2 VPS引领行业革命:为什么每个企业都需要它

    在当今数字化时代 企业面临着巨大的在线竞争压力 为了在市场中脱颖而出并确保业务的可持续增长 可靠的网络基础设施是至关重要的 这就是为什么越来越多的企业正在转向CN2 VPS的原因 这一技术正在引领行业革命 为企业提供了更高效 更安全 更可靠
  • 24届友友们还想去腾讯!?哪些岗位还在热招?看这一篇就足够!

    分享虾皮Shopee面经 iOS方向 Shopee ios开发面经 广东工业大学电子信息硕士这么好找工作吗 秋招补录公司直投链接汇总 被鸽了32个sp 太难了 求大家投小米吧 华为给我oc了 问我毁不毁约 2023年最佳雇主榜单评选结果出来
  • 工业互联网会是制造业数字化发展的未来吗?

    新工业革命正逐步形成 你认为工业互联网会是制造业数字化发展的未来吗 从这几年的工业互联网发展政策措施 就能看到答案 早在近三年前 工业互联网创新发展行动计划 2021 2023年 就提出了五方面 11项重点行动和10大重点工程 着力解决工业
  • 在喜马拉雅直播运营mentor超级nice,弹性工作制

    12月校招补录开启 C 大类岗位12 14已更新 华子开奖 好未来测开一二三四面面经 联想 测开一面面经 攒人品 联想 4 13测开 面试 联想测开一面 联想测开二面 联想测开 面试 联想测开一面 联想测开一面 base天津 联想测开一二面
  • 国外免费VPS真的零成本云计算体验?

    在当今数字化时代 云计算已经成为企业和个人的热门选择之一 云计算提供了便捷 灵活和经济高效的计算资源 可以帮助人们处理数据 托管网站 运行应用程序等等 然而 对于一些初学者来说 使用云计算可能会变得有些昂贵 但是 有一种方式可以让您尝试云计
  • 工业级路由器在风力发电场的远程监控技术

    工业级路由器在风力发电场的远程监控技术方面具有重要的应用意义 风力发电场通常由分布在广阔地区的风力发电机组组成 需要进行实时监测 数据采集和远程管理 工业级路由器作为网络通信设备 能够提供稳定可靠的网络连接和多种远程管理功能 对于风力发电场
  • 开源、免费、可私有部署的在线多人协同办公系统推荐?

    开源 免费 可私有部署的在线多人协同办公系统推荐 在考虑选择在线多人协同办公系统时 免费且开源的方案看似经济实惠 但实际上可能存在一些潜在 隐性成本 比如在系统的维护 安全性 定制化需求以及技术支持方面可能会有额外的支出 企业在选择系统时应
  • 张正友相机标定法原理与实现

    张正友相机标定法是张正友教授1998年提出的单平面棋盘格的相机标定方法 传统标定法的标定板是需要三维的 需要非常精确 这很难制作 而张正友教授提出的方法介于传统标定法和自标定法之间 但克服了传统标定法需要的高精度标定物的缺点 而仅需使用一个
  • Java_Mybatis_缓存

    缓存 1 概述 Mybatis 缓存 MyBatis 内置了一个强大的事务性查询缓存机制 它可以非常方便地配置和定制 2 会话缓存 一级缓存 sqlSession 级别的 也就是说 使用同一个 sqlSession 查询同一 sql 时 直
  • 字节电商双11 大促容量保障是如何做的?

    前言 Rhino 简介 Rhino是字节自研全链路容量评估产品 致力于构建完整的全链路容量评估解决方案 覆盖 容量预估 gt 资源准备 gt 数据准备 gt 容量验证 gt 监控 gt 分析 gt 决策 gt 处理反馈 围绕容量在稳定性 成
  • 《VirtualLab Fusion物理光学实验教程》好书分享

    目录 第一章 物理光学概念介绍 6 1 1 几何光学和光线追迹 6 1 2 物理光学和光场追迹 6 1 3 电场 磁场以及坡印廷矢量 8 1 4 振幅 相位及实部和虚部 9 1 5 振幅 相位与偏振 10 1 6菲涅尔公式 11 1 7 全
  • SqlServer_更改数据类型

    SQL server修改数据类型 使用以下命令可以进行修改 Alter table monthly import demand alter column ImportWeight DECIMAL 18 4
  • 3、Linux_系统用户管理

    1 Linux 用户管理 1 1概述 Linux系统是一个多用户多任务的操作系统 任何一个要使用系统资源的用户 都必须首先向系统管理员申请一个账号 然后以这个账号的身份进入系统 root 用户是系统默认创建的管理员账号 1 2添加用户 语法
  • Java_EasyExcel_导入_导出Java-js

    easyExcel导入 从easyexcel官网中拷贝过来 使用到的 这是使用监听器的方法 EasyExcel read file getInputStream BaseStoreDataExcelVo class new ReadList
  • 利用迈克尔逊干涉仪和傅里叶变换光谱法测量相干性

    摘要 在干涉仪中 条纹的对比度可能取决于光源的相干特性 例如 在具有一定带宽的光源的迈克尔逊干涉仪中 干涉条纹对比度随光程差的不同而变化 通过测量可动镜不同位置的干涉图对比度 可以得到光源的相干长度 典型的傅里叶变换光谱通常基于这种类型的光
  • 千呼万唤始出来!《“外研社·国才杯”竞赛一本通》焕新上线!

    写在前面 作为连续五年入选 全国高校大学生竞赛榜 的比赛 外研社 国才杯 理解当代中国 全国大学生外语能力大赛 含金量可想而知 对于想要保研的计算机er来说 能够在这样 规模大 影响力高 的比赛中 取得一定的成绩 必定会拉开自己与他人的差距
  • Java_Mybatis_动态SQL

    一 动态SQL 1 概述 动态SQL 是 MyBatis 的强大特性之一 解决拼接动态SQL时候的难题 提高开发效率 分类 if choose when otherwise trim where set foreach 2 if 做 whe