框架——动态SQL

news2024/9/20 18:54:19

目录

1.Mybatis动态SQL

 2.MyBatis 中用于实现动态 SQL 的元素

3.查所有

4.If 元素

5.trim 元素

6.Choose 元素

7.set 元素

8.foreach 元素

根据传入id删除学生信息 

根据传入列名查询学生相关信息


1.Mybatis动态SQL

MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。如果你有使用 JDBC 或其他相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空格或在列表的最后省略逗号,动态SQL可以彻底处理这种痛苦。

 2.MyBatis 中用于实现动态 SQL 的元素

If

where

trim

set

choose (when, otherwise)

foreach

3.查所有

数据库student表中的数据如下!!!

 在StudentDao类中写该方法

 //查所有

List<Student> findStudents();

 在StudentMapper.xml文件中写相应的SQL语句  

    <select id="findStudents" resultType="student">
        select * from student
    </select>

  在测试类的main方法中调用该方法

查询结果如下! 

4.If 元素

 在StudentDao类中写该方法

 List<Student> findStudents1(Student student);

 mybatis动态sql——if标签:

 if 标签可以对传入的条件进行判断
    <if test="条件表达式"></if>
    <where>
        判断内部if标签如果有一个返回true,
        会自动添加一个where关键字,
        还会去除where后面多余的关键字,

        如果标签返回的内容是以 AND 或 OR 开头,它会剔除掉 AND 或 OR。
    </where>

 在StudentMapper.xml文件中写相应的SQL语句   

 
    <select id="findStudents1" resultType="student">
        select * from student
        <where>
            <if test="name!=null">
                and name = #{name}
            </if>
            <if test="num!=0">
                and num = #{num}
            </if>
            <if test="gender!=null">
                and gender = #{gender}
            </if>
        </where>
    </select>

 在测试类的main方法中调用该方法 

查询结果如下!

5.trim 元素

 在StudentDao类中写该方法

 List<Student> findStudents2(Student student);

trim   让我们添加一个指定的前级关键字
          让我们去除一个指定的关键字

 在StudentMapper.xml文件中写相应的SQL语句    

   <select id="findStudents2" parameterType="student" resultType="student">
        select * from student
        <trim prefix="where" prefixOverrides="and|or">
            <if test="name!=null">
                or name = #{name}
            </if>
            <if test="num!=0">
                and num = #{num}
            </if>
            <if test="gender!=null">
                and gender = #{gender}
            </if>
        </trim>
    </select>

 在测试类的main方法中调用该方法  

查询结果如下! 

6.Choose 元素

在StudentDao类中写该方法

List<Student> findStudents3(Student student);

在StudentMapper.xml文件中写相应的SQL语句     

在该方法中,when和otherwise相当于if,else。当when中的条件不成立时,会走otherwise这条路

    <select id="findStudents3" parameterType="student" resultType="student">
        select * from student
        <where>
         <choose>
            <when test="name!=null">
                name = #{name}
            </when>
            <otherwise>
                name = "王五"
            </otherwise>
         </choose>
        </where>
    </select>

在测试类的main方法中调用该方法   

当在测试类的main方法中set了name,那么就会查询此时传入的name

查询结果如下! 

要是在测试类的main方法中没有set了name或者是set了数据库表里没有的name,那么查询此时就会走otherwise这条路,查询otherwise中传入的name

 

查询结果如下! 

7.set 元素

 数据库student表中的数据如下!!!

在StudentDao类中写该方法

void updateStudent(Student student);

在StudentMapper.xml文件中写相应的SQL语句     

 <set></set>  

动态添加set关键字,还可以去掉最后的逗号

  <update id="updateStudent" parameterType="student">
        update student
       <!-- <trim prefix="set" prefixOverrides=",">
        </trim>-->
        <set>
           <if test="name!=null">
              name = #{name},
           </if>
           <if test="num!=0">
              num = #{num},
           </if>
           <if test="gender!=null">
              gender = #{gender}
           </if>
        </set>
        where id = #{id}
    </update>

 在测试类的main方法中调用该方法    

 修改结果如下! 

 

8.foreach 元素

主要用在构建 in 条件中,它可以在 SQL 语句中进行迭代一个集合,foreach 元素的属性主要有 item,index,collection,open,separator,close

item 表示集合中每一个元素进行迭代时的别名

index 指定一个名字,用于表示在迭代过程中,每次迭代到的位置

open 表示该语句以什么开始

separator 表示在每次进行迭代之间以什么符号作为分隔符

close 表示以什么结束,在使用 foreach 的时候最关键的也是最容易出错的就是 collection 属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的

根据传入id删除学生信息 

在StudentDao类中写该方法 

 void deleteStudent(List<Integer> list);

 在StudentMapper.xml文件中写相应的SQL语句    

    <delete id="deleteStudent">
        delete from student where id in
          <foreach item="a" collection="list" open="(" close=")" separator=",">
            #{a}
          </foreach>
    </delete>

 在测试类的main方法中调用该方法     

 

  删除结果如下! 

 

根据传入列名查询学生相关信息

在StudentDao类中写该方法 

List<Student> findStudentsByColumn(List<String> list);

 在StudentMapper.xml文件中写相应的SQL语句    

    <select id="findStudentsByColumn" resultType="Student">
        select
            <foreach item="c" collection="list" separator=",">
                ${c}
            </foreach>
        from student
    </select>

 在测试类的main方法中调用该方法     

 

  查询结果如下! 

 

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

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

相关文章

CSRF简单介绍

欢迎交流 CSRF 条件&#xff1a; 需要请求伪造数据包无过滤防护&#xff0c;有过滤防护能绕过受害者需要触发&#xff08;诱惑&#xff09; 流程图 解决方案一&#xff1a; 检查Referer字段 解决方案二&#xff1a; CSRFToken 发货100CMS示例&#xff08;无过滤&#xff…

数据仓库系列4-什么是维度建模,它与关系型建模有什么区别

想象一下,你正在分析一家大型零售连锁店的销售数据。突然,你意识到传统的数据库模型无法有效地回答"去年黑色星期五当天,哪个地区的哪类产品销售额最高?"这样的复杂问题。这就是维度建模发挥作用的时候了 目录 引言:维度建模的魔力什么是维度建模?维度建模的定义维…

在我的博士科研生活中,SCI的英语写作一直是我的挑战。

在我的博士科研生活中&#xff0c;SCI的英语写作一直是我的挑战。尽管我不断地努力提高自己的语言水平&#xff0c;但每当我提交文章后&#xff0c;审稿人或编辑总是会指出语言表达的不足之处&#xff0c;让我深感苦恼。于是&#xff0c;我开始寻找专业的润色服务来帮助我提升文…

大模型之二十六-Diffusion model实例浅析

在2022年&#xff0c;midjourney、DALL-E以及Stable Diffusion三个文生图模型引爆了机器生产文生图领域&#xff0c;他们的模型能够在可控条件&#xff08;标签、文本描述&#xff09;下生成高分辨率、细节丰富的多样性图像&#xff0c;这在视觉上往往难以与真实图像区分。配套…

其它特殊库存

自有特殊库存 对于特殊库存&#xff0c;我们通常认为是由于所有权或存储地点与其它库存分开管理的物料库存。当过帐涉及特殊库存的货物移动时&#xff0c;除了移动类型外&#xff0c;必须&#xff08;如向特定供应商或客户或销售订单&#xff09;提供相关特殊库存标识以及更多…

3秒内搞定服务器端口扫描!用RustScan快速查看开放端口

文章目录 3秒内搞定服务器端口扫描&#xff01;用RustScan快速查看开放端口1. RustScan简介2. RustScan特点3. RustScan的基本使用3.1 创建alias别名3.2 基本用法3.3 常用参数说明3.4 示例4. 注意事项 最近开始公众号文章也开始同步更新了&#xff0c;对Java、大数据、人工智能…

游戏开发设计模式之命令模式

目录 命令模式的定义和工作原理 应用场景 实现方式 优点 缺点 结论 命令模式在游戏开发中的具体实现案例是什么&#xff1f; 如何在Unity3D中有效地实现和管理命令模式以提高游戏性能&#xff1f; 命令模式与其他设计模式&#xff08;如观察者模式、状态模式&#xff…

【C++ 面试 - 内存管理】每日 3 题(一)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

JavaScript解构介绍

​在JavaScript中&#xff0c;解构赋值&#xff08;Destructuring Assignment&#xff09;是一种方便的语法&#xff0c;用于从数组或对象中提取值并将其赋给变量。解构使得代码更简洁、可读性更高&#xff0c;同时减少了重复的代码。 1. 数组解构 数组解构允许我们从数组中提…

2024最新、最热、最全Java容器【知识点】!!!

文章目录 Java容器种类详细说说他们都有哪些内容Collection :存储对象的集合 为什么HashSet和ArrayDeque不支持有序性操作Map&#xff1a;存储键值对的映射表 ArrayList和LinkedList的区别&#xff1f;ArrayList的增删一定比LinkedList的增删慢吗&#xff1f;native()方法是什么…

SOMEIP_ETS_064: String_UTF16FIXED_too_short

测试目的&#xff1a; 验证当设备&#xff08;DUT&#xff09;接收到一个小于64字节的UTF16FIXED字符串时&#xff0c;是否能够返回错误消息。 描述 本测试用例旨在检查DUT在接收到一个长度小于64字节的UTF16FIXED字符串的SOME/IP消息时&#xff0c;是否能够返回格式错误&am…

04-javascript 高阶(知识点)

目录 1.严格模式 1.1什么是严格模式 1.2开启严格模式 1.3严格模式中的变化 2.高阶函数 3.闭包 3.1 变量的作用域 3.2 什么是闭包 3.3 闭包的作用 3.4 闭包的案例 4.递归 4.1 什么是递归 4.2 利用递归求1~n的阶乘 5.赋值(地址传递)-浅拷贝-深拷贝 5.1 地址传递 5…

MATLAB中bicgstabl函数用法

目录 语法 说明 示例 线性系统的迭代解 使用指定了预条件子的 bicgstabl 提供初始估计值 使用函数句柄代替数值矩阵 bicgstabl函数的功能是求解线性系统 - 稳定双共轭梯度 (l) 法。 语法 x bicgstabl(A,b) x bicgstabl(A,b,tol) x bicgstabl(A,b,tol,maxit) x bic…

map容器的所有操作

1.基本概念 2.构造和赋值 注意map中存放的是pair对组&#xff0c;<key,value>&#xff0c;会根据key自动排序 3.大小和交换 4.插入和删除 插入的四种方式&#xff1a; 5.查找和统计 6.排序

8.21-部署eleme项目

1.设置主从从mysql57服务器 &#xff08;1&#xff09;配置主数据库 [rootmsater_5 ~]# systemctl stop firewalld[rootmsater_5 ~]# setenforce 0[rootmsater_5 ~]# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.serv…

# 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群

利刃出鞘_Tomcat 核心原理解析&#xff08;八&#xff09;-- Tomcat 集群 一、Tomcat专题 - Tomcat集群 - 介绍及准备工作 1、Tomcat集群 简介 由于单台Tomcat的承载能力是有限的&#xff0c;当我们的业务系统用户量比较大&#xff0c;请求压力比较大时&#xff0c;单台Tomc…

i.MX6裸机开发(8):中断

相比STM32的NVIC&#xff0c;i.MX 6ULL的中断控制系统更复杂&#xff0c;它的中断管理器使用的是GIC V2&#xff0c;GIC V2的实现方式与我们熟知的NVIC差别较大。 本章重点讲解i.MX 6U的GIC基本结构以及实现方法&#xff0c;更详细的介绍可以参考《ARM Generic Interrupt Contr…

快速学习初阶“堆“(数据结构C语言)

前言&#xff1a; 二叉树是什么&#xff1f; 同样也和之前的"栈"跟"队列"是一样的&#xff0c;是一种存储数据的方式&#xff0c;只不过二叉树的结构更为复杂。 那么为什么要用二叉树存储数据呢&#xff1f;真的多此一举吗&#xff1f; 它的实际作用是什么…

买对不买贵,宠物空气净化器应该怎么选才能选到好的产品

你是否还在为家中无处不在的猫毛而烦恼&#xff1f;每当有风吹来&#xff0c;就把四处躲藏的猫毛给吹出来&#xff0c;不经意间就可能让这些”蒲公英“悄悄附在你的食物上&#xff0c;或是不经意间吸入鼻腔&#xff0c;让人既无奈又尴尬。你是否每天下班回家后的第一件事&#…

AnyV2V:一种用于各种视频编辑任务的即插即用框架

人工智能咨询培训老师叶梓 转载标明出处 视频编辑任务通常涉及根据额外的控制信息&#xff08;如文本提示、主题、风格等&#xff09;编辑源视频&#xff0c;以生成与源视频和提供的控制信息相符的新视频。然而&#xff0c;现有方法往往局限于特定类型的编辑任务&#xff0c;难…