Mybatis动态SQL用法

news2024/11/18 7:51:21

动态SQL是Mybatis的一大重要特性,它可以完成不同条件下的SQL拼接,降低了因为SQL语句书写中的小错误而造成程序报错的概率,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号,利用动态SQL就可以解决这些难题。

常见动态SQL标签:

  1. <if>
  2. <where>
  3. <choose> <when> <otherwise>
  4. <set>
  5. <foreach>
  6. <trim>

目录

实体类及数据库相关配置

实体类

 数据库连接配置

数据库数据 

标签

sql语句

测试结果

标签

sql语句

测试结果

choose> 标签

sql语句

测试结果

标签

sql语句

测试结果

标签

sql语句

测试结果

 标签

 标签可以替换其他标签


实体类及数据库相关配置

实体类

@Data   //加上lombok注解 方便对实体类进行操作
public class UserInfo {
    private Integer id;
    private String username;
    private String password;
}

 数据库连接配置

# 配置数据库连接
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/blog?characterEncoding=utf8
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

# 设置日志级别
logging:
  level:
    com:
      example:
        demo: debug

mybatis:
  # 配置 mybatis xml 文件的保存路径
  mapper-locations: classpath:/mybatis/**Mapper.xml
  # 开启 MyBatis SQL 打印
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

数据库数据 

<if>标签

作用:判断一个参数是否有值,如果没有值就会隐藏if中的sql语句

sql语句

    <select id="getUserById" resultType="com.example.demo.model.UserInfo">
        select * from userinfo where 1= 1
        <if test="id!=null">
            and id=#{id}
        </if>
    </select>

测试结果

输入id:

 不传入id:

 传入id时,就会拼接if标签内的sql语句,否则不进行拼接。

<where>标签

上述使用if语句进行查询时我们加了一个条件where 1=1,这个语句是为了保证语句成立的,不至于程序报错,但是Mybatis中设计了更好的方法,就是把<where>也作为一个标签元素,从而达到动态添加where的效果

作用:实现查询中的where sql替换的,如果没有任何查询条件,那么它可以隐藏查询中的where sql,如果存在查询条件,那么会生成where的sql查询,并且where标签可以自动去除最前面的一个and字符

sql语句

    <select id="getUserById" resultType="com.example.demo.model.UserInfo">
        select * from userinfo
        <where>
            <if test="id!=null">
                and id=#{id}
            </if>
        </where>
    </select>

测试结果

传入id:

 不传入id:

 在查找时,如果传入id就会拼接条件查询的语句,否则不拼接查询表内所有数据。

choose> <when> <otherwise>标签

在使用< if >元素时,只要test属性中的表达式为true,就会执行元素中的条件语句,但是在实际应用中,有时只需要从多个选项中选择一个去执行。在这种场景下,使用< if > 元素进行处理是非常不合理的。如果使用的是Java语言,这种情况显然更适合switch语句来处理,那么MyBatis中有没有类似的语句呢?当然是有的。针对上面的情况,MyBatsi可以用< choose >,< when >,< otherwise >元素组合去实现上面的情况

作用:从多个选项中选择一个去进行sql语句的拼接

sql语句

    <select id="getUserByChoose" resultType="com.example.demo.model.UserInfo">
        select * from userinfo
        <where>
            <choose>
                <when test="id!=null">
                    id=#{id}
                </when>
            </choose>
            <choose>
                <when test="username!=null">
                    username=#{username
                </when>
            </choose>
            <choose>
                <when test="password!=null">
                    password=#{password}
                </when>
            </choose>
        </where>
    </select>

测试结果

 当条件满足其中一项时后面就不会再去匹配,这里id匹配正确就会停止后面username以及password的匹配(不管这两个字段是否匹配成功),当所输入的字段均不能被匹配也可以使用<otherwise>标签返回默认值。

<set>标签

作用:进行修改操作时,配合if标签来处理非必要传输,会自动去除最后一个英文逗号

sql语句

    <update id="update">
        update userinfo
        <set>
            <if test="id!=null">
                id=#{id},
            </if>
            <if test="username!=null">
                username=#{username},
            </if>
            <if test="password!=null">
                password=#{password}
            </if>
        </set>
        where id=#{id}
    </update>

测试结果

<foreach>标签

作用:对集合进行循环

<foreach>标签中的主要属性介绍:

  • collection:绑定方法参数中的集合,如List、Set、Map或数组对象
  • item:遍历时的每一个对象
  • open:语句块开头的字符串
  • close:语句块结束的字符串
  • separator:每次遍历之间间隔的字符串

sql语句

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

测试结果

 <trim>标签

作用:相当于替换,也可以去除 SQL 语句前后多余的某个字符

<trim>标签中的主要属性介绍:

  • prefix:表示整个语句块,以prefix的值作为前缀
  • suffix:表示整个语句块,以suffix的值作为前缀
  • prefixOverrides表示整个语句块要去掉的前缀
  • suffixOverrides表示整个语句块要去掉的后缀

 <trim>标签可以替换其他标签

<where> 等于 <trim prefix="where" prefixOverrides="and">

<set> 等于 <trim prefix="set" suffixOverrides=",">

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

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

相关文章

Vue项目dialog组件数据项清空

目录 一、重置myParams 二、this.$refs["name"].resetFields() 1、使用v-if 然后渲染, 无效 2、使用nextTick, 数据显示慢一拍, 重新打开dialog才会显示上次输入的内容 三、复盘-最终方法 一、重置myParams <el-form:model"myParams":rules&quo…

ssh登录出现Permission denied, please try again可能的解决方案

问题描述 环境&#xff1a;ubuntu 20.04问题描述&#xff1a;在已经设置免密登录后&#xff0c;ssh登录时&#xff08;例如ssh localhost&#xff09;还需要输入密码&#xff0c;并且输入密码后出现下面一系列的报错&#xff1a; xxx(用户名)localhosts password: Permissio…

Makefile教程(入门介绍)

文章目录 前言一、Makefile介绍二、make和Makefile的关系三、编写一个简单的Makefile总结 前言 本篇文章将带大家学习Makefile&#xff0c;Makefile在文件的编译中起到重要作用&#xff0c;在Linux中我们也是经常使用到Makefile&#xff0c;下面我将会带大家学习什么是Makefil…

GNSS定位原理--理解笔记

1、利用“后方交会”原理进行定位。 由已知3个点的坐标以及3个已知点到未知点的距离&#xff0c;就可以计算出未知点的坐标。测量出3个已知点到位置点的距离后&#xff0c;根据三球交会定位&#xff0c;利用方程计算出未知点坐标。 两球交会得到一个圆&#xff0c;三球交会得…

【自学网络安全】从零开始学习网络渗透的核心知识点,助你入门宝典

前言 上周旁听了一个大学学长组织的线上网络安全交流会&#xff0c;里边不乏充斥着各位行业大牛&#xff0c;讲的内容确实精彩&#xff0c;可能对于网络安全经验5年的人来说&#xff0c;是受益匪浅&#xff0c;欢迎程度极高&#xff0c;恨不得跳出屏幕来表示赞同&#xff0c;毕…

初识Spring:如何在Maven工程上搭建Spring框架?

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 Maven版本&#xff1a;apache-maven-3.6.3 Mybatis版本&#xff1a;3.5.6 spring版本&#xff1a;5.3.1 文章目录 Spring系列专栏文章目录一. 什么是Spring&#xff1f;二. 如何搭建S…

基于海鸥算法改进的随机森林分类算法-附代码

基于海鸥算法改进的随机森林分类算法 文章目录 基于海鸥算法改进的随机森林分类算法1.数据集2.RF模型3.基于海鸥算法优化的RF4.测试结果5.Matlab代码6.Python代码 摘要&#xff1a;为了提高随机森林数据的分类预测准确率&#xff0c;对随机森林中的树木个数和最小叶子点数参数利…

Java阶段二Day13

Java阶段二Day13 文章目录 Java阶段二Day13网站SpringSpringFramework核心模块特点使用Spring创建项目对象存储创建对象的方式 IoC容器控制反转依赖注入IoC容器的实现 基于XML管理bean获取bean方式xml配置文件中的标签特殊值处理注入 今天开始是学习后端框架SSM&#xff08;Spr…

元气森林讲出新的“可乐味”故事?

这个五一&#xff0c;一场接一场的音乐节不断拔高假日的声浪。仅成都一市&#xff0c;就开展了298场演出&#xff0c;累计吸引10万余游客市民观看。人潮涌动之间&#xff0c;节日的氛围被拉满。 值得一提的是&#xff0c;音乐节不仅是游客的狂欢&#xff0c;也是消费品牌的盛宴…

【Java|golang】1419. 数青蛙

给你一个字符串 croakOfFrogs&#xff0c;它表示不同青蛙发出的蛙鸣声&#xff08;字符串 “croak” &#xff09;的组合。由于同一时间可以有多只青蛙呱呱作响&#xff0c;所以 croakOfFrogs 中会混合多个 “croak” 。 请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。…

Spring Boot集成ShardingSphere实现读写分离(四) | Spring Cloud 43

一、读写分离 1.1 背景 面对日益增加的系统访问量&#xff0c;数据库的吞吐量面临着巨大瓶颈。 对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说&#xff0c;将数据库拆分为主库和从库&#xff0c;主库负责处理事务性的增删改操作&#xff0c;从库负责处理查询操…

Qt的Model/View结构

Model/View结构 将界面组件与所编辑的数据分离开来&#xff0c;又通过数据源的方式连接起来&#xff0c;是处理界面与数据的一种较好的方式。Qt使用Model/View结构来处理这种关系&#xff0c;Model/View的基本结构如图5-1所示。其中各部分的功能如下。 图1 Model/View基本结构…

ps磨皮插件专用智能磨皮插件 AI算法美颜 提高P图效率

ps的功能这么强大&#xff0c;其美白磨皮方法当然不止一种。本文就给大家细数一下ps美白磨皮常用的几种方法。在各种方法中&#xff0c;插件法的操作更为简单&#xff0c;效果也更好&#xff0c;因此我们还会介绍ps磨皮美白插件哪个好。事不宜迟&#xff0c;一起来看看吧。 一…

Throwable、Error、Exception 运行时异常、非运行时异常

一、Throwable Throwable类&#xff08;可抛出&#xff09;是一个超类&#xff0c;是所有错误和异常根。只有继承于Throwable的类或者其子类才能够被抛出。 有两个子类为Error和Exception&#xff0c;其他的异常类都继承于这两个子类。 三、Error和Exception Error类及其子类…

C++知识点 -- 智能指针

C知识点 – 智能指针 文章目录 C知识点 -- 智能指针一、智能指针的使用及原理1.使用场景2.RAII3.智能指针的设计思想4.智能指针的拷贝问题 二、auto_ptr三、unique_ptr四、shared_ptr1.模拟实现2.shared_ptr的循环引用 五、weak_ptr六、定制删除器七、内存泄漏1.什么是内存泄漏…

PDF转Word免费的软件有哪些?(完整教程版!)

这五种免费PDF转Word的方式&#xff0c;不仅免费&#xff0c;还能准确恢复PDF文件内容&#xff0c;前方高能&#xff0c;快速学习&#xff01; 1.Office直接打开 大厂软件&#xff0c;既能读文档又能转换格式&#xff0c;总让人放心。 转换流程1&#xff1a;在Word的最新版本…

Zero系列三部曲:Zero、Zero-Offload、Zero-Infinity

Zero系列三部曲&#xff1a;Zero、Zero-Offload、Zero-Infinity ZeroIntroductionZero DP流程图详解 Zero-R Zero-OffloadZero- Infinityreference Zero Introduction 以数据并行为例&#xff0c;在训练的时候&#xff0c;首先把模型参数在每个GPU上复制一份&#xff0c;然后…

IP报文解析(TCP、UDP、 ICMP)及代码分享(C++)

一、OSI模型与TCP/IP协议栈 1.1 OSI 7层模型&#xff1a; 应用层&#xff1a; 功能&#xff1a;用户接口&#xff0c;文件传输、电子邮件、虚拟终端、文件服务 设备&#xff1a;网关 协议&#xff1a;HTTP、TFTP、SMTP、FTP、SNMP、DNS、Telnet 表示层&#xff1a; 功能&…

Spring 面试题总结(2023最新版)

文章目录 1、谈谈你对Spring的理解&#xff1f;1.1 发展历程1.2 Spirng的组成1.3 Spring的好处 2、Autowired和Resource的区别2.1 共同点&#xff1a;2.2 Autowired2.3 Resource2.3.1 Resource的装配顺序 3、Spring常用注解3.1、给容器中注入组件3.1.1 包扫描组件标注注解3.1.2…

复数的基本知识

复数的基本知识 文章目录 复数的基本知识前言表示方法百度百科简单来说&#xff1a; 复数的运算 前言 这里只有一点点关于复数的知识&#xff0c;主要是最近的FFT要用到。 表示方法 百度百科 我们把形如 abi &#xff08;a,b均为实数&#xff09;的数称为复数&#xff0c;其…